home *** CD-ROM | disk | FTP | other *** search
/ Software Vault: The Gold Collection / Software Vault - The Gold Collection (American Databankers) (1993).ISO / cdr12 / pplasc.zip / PPL3.ASC < prev   
Text File  |  1993-06-04  |  234KB  |  6,630 lines

  1.  
  2.  
  3.  
  4.  
  5.  
  6.  
  7.  
  8.  
  9.                           
  10.  
  11.  
  12.  
  13.                   MODEM()   Function
  14.  
  15.                    Function
  16.                       Access the connect string as reported by the modem.
  17.  
  18.                        Syntax
  19.                       MODEM()
  20.                                 No arguments are required
  21.  
  22.                        Return Type & Value
  23.  
  24.                       STRING      Returns the modem connect string.
  25.                        Remarks
  26.  
  27.                       PCBoard expects and requires certain information to be  reported
  28.                           by the  modem anytime a user  connects to the BBS.   The minimum
  29.                           requirement is a string with the word CONNECT; other information
  30.                           may be  included, such as  the connect speed,  error correction,
  31.                           data compression, etc.  Should your PPL application have need of
  32.                           this information as well, it may be accessed with this function.
  33.                        Examples
  34.  
  35.                         FAPPEND 1,"MODEM.LOG",O_WR,S_DW
  36.                         FPUTLN 1,LEFT(U_NAME(),30)+MODEM()
  37.                         FCLOSE 1
  38.  
  39.                    See Also
  40.  
  41.  
  42.  
  43.  
  44.  
  45.  
  46.  
  47.                           
  48.  
  49.  
  50.  
  51.                   MONEY   Type
  52.  
  53.                    Function
  54.                       Declare one or more variables of type money.
  55.  
  56.                        Syntax
  57.                       MONEY var|arr(s[,s[,s]])[,var|arr(s[,s[,s]])]
  58.                                 var  The name of a variable to  declare.  Must start with
  59.                           a letter [A-Z] which may be followed by letters, digits [0-9] or
  60.                           the underscore  [_].  May be of any length but only the first 32
  61.                           characters are used.
  62.  
  63.                                 arr  The name of an array variable to  declare.  The same
  64.                           naming conventions as var are used.
  65.                                 s    The size  (0-based) of an  array variable dimension.
  66.                           Any constant integer expression is allowed.
  67.  
  68.                        Remarks
  69.                       MONEY  variables are stored as  positive or negative cents.  The
  70.                           range of  MONEY is $-21,474,836.48 through  $+21,474,836.47.  It
  71.                           is stored  internally as  a four byte  signed long integer.   If
  72.                           MONEY  is assigned to or from an  INTEGER type then the cents (-
  73.                           2,147,483,648  -  +2,147,483,647) are  assigned.    If MONEY  is
  74.                           assigned to a  STRING type then it is automatically converted to
  75.                           the  following format:   "$sD.CC",  where s  is the sign  (- for
  76.                           negative amounts, nothing for positive amounts), D is the dollar
  77.                           amount (one or more digits as needed) and CC is the cents amount
  78.                           (00-99).  If a STRING is assigned to MONEY then PPL will do it's
  79.                           best to  convert the  string back to  the appropriate amount  of
  80.                           money.  All other types, when assigned to or from MONEY, will be
  81.                           converted  to an INTEGER first  before being assigned to or from
  82.                           the MONEY type.
  83.  
  84.                        Examples
  85.  
  86.                         MONEY itemAmt, subTot, total, priceList(2,17)
  87.  
  88.                    See Also
  89.                       BOOLEAN Type, DATE Type, INTEGER Type, STRING Type, TIME Type
  90.  
  91.  
  92.  
  93.  
  94.  
  95.  
  96.  
  97.                           
  98.  
  99.  
  100.  
  101.                   MONTH()   Function
  102.  
  103.                    Function
  104.                       Extracts the month of the year from a specified date.
  105.  
  106.                        Syntax
  107.                       MONTH(dexp)
  108.                                 dexp Any date expression.
  109.  
  110.                        Return Type & Value
  111.  
  112.                       INTEGER     Returns the month from the specified date expression
  113.                           (dexp).  Valid return values are from 1 to 12.
  114.                        Remarks
  115.  
  116.                       This  function  allows you  to  extract  a  particular piece  of
  117.                           information about  a DATE value, in  this case the  month of the
  118.                           date.
  119.                        Examples
  120.  
  121.                         PRINTLN "This month is:  ",MONTH(DATE())
  122.  
  123.                    See Also
  124.                       DAY() Function, DOW() Function, YEAR() Function
  125.  
  126.  
  127.  
  128.  
  129.  
  130.  
  131.  
  132.                           
  133.  
  134.  
  135.  
  136.                   MORE   Statement
  137.  
  138.                    Function
  139.                       Pause the display and ask the user how to continue.
  140.  
  141.                        Syntax
  142.                       MORE
  143.                                 No arguments are required
  144.  
  145.                        Remarks
  146.  
  147.                       It is often necessary to pause in the display of information and
  148.                           wait for the user to catch up.  This statement allows you prompt
  149.                           the user on how to continue.  The acceptable responses are Y (or
  150.                           whatever letter is appropriate for the users language selection)
  151.                           to continue,  N (or, again,  whatever letter is  appropriate) to
  152.                           abort,  or NS to continue in non-stop  mode.  It displays prompt
  153.                           number 196 from the PCBTEXT file for the current language to let
  154.                           the user know what is expected.
  155.                        Examples
  156.  
  157.                         PRINTLN "Your account has expired!"
  158.                         PRINTLN "You are about to be logged off"
  159.                         MORE
  160.                         PRINTLN "Call me voice to renew your subscription"
  161.  
  162.                    See Also
  163.                       WAIT Statement
  164.  
  165.  
  166.  
  167.  
  168.  
  169.  
  170.  
  171.                           
  172.  
  173.  
  174.  
  175.                   MPRINT/MPRINTLN   Statements
  176.  
  177.                    Function
  178.                       Print (write) a  line to the caller's screen (modem)  only (with
  179.                           an optional newline appended).
  180.  
  181.                        Syntax
  182.                       M   P   R   I   N   Te   x   p   [   ,   e   x   p   ]
  183.  
  184.                       -                o                r                -
  185.  
  186.                       MPRINTLN [exp[,exp]]
  187.                                 exp  An expression of any type  to evaluate and write  to
  188.                           the caller's screen.
  189.  
  190.                        Remarks
  191.  
  192.                       These statements will evalutate zero, one or more expressions of
  193.                           any  type and write  the results to  the modem for  the caller's
  194.                           display.   The MPRINTLN  statement will append a  newline to the
  195.                           end of the expressions; MPRINT will not.  Note that at least one
  196.                           expression  must be  specified for  MPRINT, unlike  the MPRINTLN
  197.                           statement which need not have any arguments passed to it.  These
  198.                           statements  only  send  information  to  the  modem and  do  not
  199.                           interpret @ codes;  if the remote caller has ANSI then ANSI will
  200.                           be interpreted.
  201.                        Examples
  202.  
  203.                         MPRINT "The name of the currently running PPE file
  204.                         is "
  205.                         MPRINTLN PPENAME(),"."
  206.                         MPRINT "The path where it is located is "
  207.                         MPRINTLN PPEPATH(),"."
  208.                         MPRINT "The date is ",DATE()," and the time is
  209.                         ",TIME(),"."
  210.                         MPRINTLN
  211.  
  212.                    See Also
  213.                       PRINT/PRINTLN Statements, SPRINT/SPRINTLN Statements
  214.  
  215.  
  216.  
  217.  
  218.  
  219.  
  220.  
  221.                           
  222.  
  223.  
  224.  
  225.                   NC   Constant
  226.  
  227.                    Function
  228.                       To re-start the display of information according to the  current
  229.                           mode.
  230.  
  231.                        Value
  232.                       0 = 0b = 0o = 0h
  233.  
  234.                        Remarks
  235.                       The  STARTDISP  statement  takes  a  single  argument  to  start
  236.                           displaying information in  a certain format.   FCL tells PCBoard
  237.                           to  count  lines  and  pause as  needed  during  the display  of
  238.                           information.  FNS  tells PCBoard to not stop during  the display
  239.                           of information.   NC instructs  PCBoard to start  over with  the
  240.                           last specified mode (FCL or FNS).
  241.  
  242.                        Examples
  243.  
  244.                         INTEGER i,j
  245.                         STARTDISP FCL
  246.                         FOR i = 1 TO 5
  247.                           STARTDISP NC
  248.                           FOR j = 1 to 50
  249.                             PRINTLN "This is line ",j
  250.                           NEXT
  251.                         NEXT
  252.  
  253.                    See Also
  254.                       FCL Constant, FNS Constant
  255.  
  256.  
  257.  
  258.  
  259.  
  260.  
  261.  
  262.                           
  263.  
  264.  
  265.  
  266.                   NEWLINE   Constant
  267.  
  268.                    Function
  269.                       Set the new line after prompt flag in an INPUTSTR, PROMPTSTR, or
  270.                           DISPTEXT statement.
  271.  
  272.                        Value
  273.                       64 = 1000000b = 100o = 40h
  274.  
  275.                        Remarks
  276.                       The  INPUTSTR,  PROMPTSTR,  and  DISPTEXT  statements  have  the
  277.                           ability  to send a  carriage return/line feed after  a prompt is
  278.                           displayed automatically and without the  need to make a separate
  279.                           call to the NEWLINE statement.
  280.  
  281.                        Examples
  282.  
  283.                         STRING pwd
  284.                         INPUTSTR "Enter
  285.                         id",pwd,@X0E,4,"0123456789",LFBEFORE+NEWLINE+LFAFTE
  286.                         R
  287.                         IF (pwd <> "1234") PRINTLN "Bad id"
  288.  
  289.                    See Also
  290.                       DISPTEXT   Statement,  INPUTSTR  Statement,   LFAFTER  Constant,
  291.                           LFBEFORE Constant, PROMPTSTR Statement
  292.  
  293.  
  294.  
  295.  
  296.  
  297.  
  298.  
  299.                           
  300.  
  301.  
  302.  
  303.                   NEWLINE   Statement
  304.  
  305.                    Function
  306.                       Move the cursor to the beginning of the next line.
  307.  
  308.                        Syntax
  309.                       NEWLINE
  310.                                 No arguments are required
  311.  
  312.                        Remarks
  313.  
  314.                       This statement should be used for moving to the beginning of the
  315.                           next line  on screen,  scrolling if  necessary.  It  will do  so
  316.                           regardless of the current cursor position,  unlike the FRESHLINE
  317.                           statement.
  318.                        Examples
  319.  
  320.                         INTEGER i, end
  321.                         LET end = RANDOM(20)
  322.                         FOR i = 1 TO end
  323.                           PRINT RIGHT(RANDOM(10000),8)
  324.                         NEXT
  325.                         FRESHLINE
  326.                         NEWLINE
  327.                         PRINTLN "Now we continue with a blank line between"
  328.  
  329.                    See Also
  330.                       FRESHLINE Statement, NEWLINES Statement
  331.  
  332.  
  333.  
  334.  
  335.  
  336.  
  337.  
  338.                           
  339.  
  340.  
  341.  
  342.                   NEWLINES   Statement
  343.  
  344.                    Function
  345.                       Execute a specified number of NEWLINE statements.
  346.  
  347.                        Syntax
  348.                       NEWLINES count
  349.                                 count     An integer expression with the number of times
  350.                           to execute NEWLINE.
  351.  
  352.                        Remarks
  353.  
  354.                       This  statement is  convienient  when executing  multiple and/or
  355.                           variable NEWLINE statements  for screen formatting.   It takes a
  356.                           single  integer expression  argument and  automatically executes
  357.                           that many NEWLINE statements for you without  the need to set up
  358.                           a loop or to write multiple NEWLINE lines in your source code.
  359.                        Examples
  360.  
  361.                         INTEGER i, end
  362.                         LET end = RANDOM(20)
  363.                         FOR i = 1 TO end
  364.                           PRINT RIGHT(RANDOM(10000),8)
  365.                         NEXT
  366.                         FRESHLINE
  367.                         NEWLINE 5
  368.                         PRINTLN "Now we continue with a 5 blank lines
  369.                         between"
  370.  
  371.                    See Also
  372.                       FRESHLINE Statement, NEWLINE Statement
  373.  
  374.  
  375.  
  376.  
  377.  
  378.  
  379.  
  380.                           
  381.  
  382.  
  383.  
  384.                   NEWPWD   Statement
  385.  
  386.                    Function
  387.                       Change the  users  password  and maintain  the password  PSA  if
  388.                           installed.
  389.  
  390.                        Syntax
  391.                       NEWPWD pwd,var
  392.                                 pwd  A string  expression with the  new password  for the
  393.                           user.
  394.  
  395.                                 var  A variable to hold the password  change status; TRUE
  396.                           if the password was changed or FALSE otherwise.
  397.  
  398.                        Remarks
  399.                       There  are  two ways  to  change the  users  password under  PPL
  400.                           control.   The first  is to  simply use  the GETUSER  statement,
  401.                           assign the  new password to  the U_PWD variable, then  issue the
  402.                           PUTUSER statement.   However, this  isn't adequate if  the SysOp
  403.                           has installed the password  PSA.  This statement will take  care
  404.                           of validating  the password,  checking it  against the  password
  405.                           history, updating the password history, setting a new expiration
  406.                           date if necessary  and incrementing  the times changed  counter.
  407.                           If the password fails  a validity test then this statement  will
  408.                           set the var parameter to FALSE to let you know that the password
  409.                           wasn't changed.   If the password PSA isn't  installed or if the
  410.                           password conforms  to the PSA requirements, then var will be set
  411.                           to TRUE.
  412.                        Examples
  413.  
  414.                         BOOLEAN changed
  415.                         STRING  pwd
  416.                         INPUTSTR "Enter a new
  417.                         password",pwd,@X0E,12,MASK_PWD(),ECHODOTS
  418.                         NEWLINE
  419.                         NEWPWD pwd,changed
  420.                         IF (!changed) PRINTLN "Password not changed"
  421.  
  422.                    See Also
  423.  
  424.  
  425.  
  426.  
  427.  
  428.  
  429.  
  430.                           
  431.  
  432.  
  433.  
  434.                   NOCHAR()   Function
  435.  
  436.                    Function
  437.                       Get the no response character for the current language.
  438.  
  439.                        Syntax
  440.                       NOCHAR()
  441.                                 No arguments are required
  442.  
  443.                        Return Type & Value
  444.  
  445.                       STRING      Returns the no character for the current language.
  446.                        Remarks
  447.  
  448.                       Support for  foreign  language yes/no  responses can  be  easily
  449.                           added  by  using this  function  to  determine  what a  negative
  450.                           response  should  be  instead  of  hardcoding  the  english  "N"
  451.                           character.
  452.                        Examples
  453.  
  454.                         STRING ans
  455.                         LET ans = YESCHAR()
  456.                         INPUTSTR "Run program now",ans,@X0E,1,"",AUTO+YESNO
  457.                         IF (ans = NOCHAR()) END
  458.  
  459.                    See Also
  460.                       YESCHAR() Function, YESNO Constant
  461.  
  462.  
  463.  
  464.  
  465.  
  466.  
  467.  
  468.                           
  469.  
  470.  
  471.  
  472.                   NOCLEAR   Constant
  473.  
  474.                    Function
  475.                       Set the no  clear input field flag  in an INPUTSTR or  PROMPTSTR
  476.                           statement.
  477.  
  478.                        Value
  479.                       1024 = 10000000000b = 2000o = 400h
  480.  
  481.                        Remarks
  482.                       The  INPUTSTR and  PROMPTSTR  statements  have  the  ability  to
  483.                           automatically clear the default  value from the input field when
  484.                           the  users presses his first key if  ANSI is available.  This is
  485.                           the  default mode  of  operations.   If you  don't want  this to
  486.                           happen, you may use this flag to disable this feature.
  487.  
  488.                        Examples
  489.  
  490.                         STRING cmds
  491.                         LET cmds = "QUIT"
  492.                         INPUTSTR
  493.                         "Commands",cmds,@X0E,60,MASK_ASCII(),STACKED+NOCLEA
  494.                         R
  495.                         TOKENIZE cmds
  496.                         LET cmds = GETTOKEN()
  497.                         IF (cmds = "QUIT") END
  498.                         KBDSTUFF cmds+TOKENSTR()
  499.  
  500.                    See Also
  501.                       INPUTSTR Statement, PROMPTSTR Statement
  502.  
  503.  
  504.  
  505.  
  506.  
  507.  
  508.  
  509.                           
  510.  
  511.  
  512.  
  513.                   NOT()   Function
  514.  
  515.                    Function
  516.                       Calculate the bitwise NOT of an integer argument.
  517.  
  518.                        Syntax
  519.                       NOT(iexp)
  520.                                 iexp Any integer expression.
  521.  
  522.                        Return Type & Value
  523.  
  524.                       INTEGER     Returns the bitwise NOT of iexp.
  525.                        Remarks
  526.  
  527.                       This function  may  be used  to toggle  all bits  in an  integer
  528.                           expression.   Wherever a bit had been set it will be clear after
  529.                           this function call, and vice versa.
  530.                        Examples
  531.  
  532.                         ' Toggle the bits
  533.                         PRINTLN NOT(1248h)
  534.                         ' Toggle all flag
  535.                         INTEGER flag
  536.                         LET flag = NOT(flag)
  537.  
  538.                    See Also
  539.                       AND() Function, OR() Function, XOR() Function
  540.  
  541.  
  542.  
  543.  
  544.  
  545.  
  546.  
  547.                           
  548.  
  549.  
  550.  
  551.                   ONLOCAL()   Function
  552.  
  553.                    Function
  554.                       Determine whether or not a caller is on locally.
  555.  
  556.                        Syntax
  557.                       ONLOCAL()
  558.                                 No arguments are required
  559.  
  560.                        Return Type & Value
  561.  
  562.                       BOOLEAN     Returns  TRUE if  the  caller is  on locally,  FALSE
  563.                           otherwise.
  564.                        Remarks
  565.  
  566.                       There  are some  features that  work differently  for  local and
  567.                           remote callers, such as file transfers and modem communications.
  568.                           This function will report to you whether or not a user is logged
  569.                           on locally and allow you to handle local processing  differently
  570.                           than remote processing.
  571.                        Examples
  572.  
  573.                         IF (ONLOCAL()) THEN
  574.                           PRINTLN "Call back verification cannot be
  575.                         performed for"
  576.                           PRINTLN "users logged in locally!"
  577.                           END
  578.                         ENDIF
  579.                         CALL "CALLBACK.PPE"
  580.  
  581.                    See Also
  582.  
  583.  
  584.  
  585.  
  586.  
  587.  
  588.  
  589.                           
  590.  
  591.  
  592.  
  593.                   OPENCAP   Statement
  594.  
  595.                    Function
  596.                       Open the screen capture file.
  597.  
  598.                        Syntax
  599.                       OPENCAP file,stat
  600.                                 file A string expression with the filename to open.
  601.  
  602.                                 stat A variable to hold the return  status (TRUE if error
  603.                           opening file, FALSE otherwise).
  604.  
  605.                        Remarks
  606.                       PCBoard has the ability to capture  screen output to a file  for
  607.                           later reference.  PPL  allows that same ability via the  OPENCAP
  608.                           and CLOSECAP statements.  This could be useful in a program that
  609.                           executes  a series  of commands in  non-stop mode.   The process
  610.                           could open a capture file first, execute the commands, close the
  611.                           capture  file,  then allow  the  user to  view  or download  the
  612.                           capture file.   CLOSECAP closes  the capture file and  turns off
  613.                           screen  capturing.  Also, the SHOWON  and SHOWOFF statements can
  614.                           be  used to turn  on and off  showing information to  the screen
  615.                           while  allowing that same information  (even if not displayed or
  616.                           transmitted via modem) to be captured to a file.  The SHOWSTAT()
  617.                           function can be used to check  the current status of the  SHOWON
  618.                           and SHOWOFF statements.
  619.                        Examples
  620.  
  621.                         BOOLEAN ss
  622.                         LET ss = SHOWSTAT()
  623.                         SHOWOFF
  624.                         OPENCAP "CAP"+STRING(PCBNODE()),ocFlag
  625.                         IF (ocFlag) THEN
  626.                           DIR "U;NS"
  627.                           CLOSECAP
  628.                           KBDSTUFF "FLAG CAP"+STRING(PCBNODE())+CHR(13)
  629.                         ENDIF
  630.                         IF (ss) THEN
  631.                           SHOWON
  632.                         ELSE
  633.                           SHOWOFF
  634.                         ENDIF
  635.  
  636.                    See Also
  637.  
  638.                       CLOSECAP   Statement,   SHOWOFF  Statement,   SHOWON  Statement,
  639.                           SHOWSTAT() Function
  640.  
  641.  
  642.  
  643.  
  644.  
  645.  
  646.  
  647.                           
  648.  
  649.  
  650.  
  651.                   OPTEXT   Statement
  652.  
  653.                    Function
  654.                       Set the text to be used by the @OPTEXT@ macro.
  655.  
  656.                        Syntax
  657.                       OPTEXT str
  658.                                 str  Any string expression.
  659.  
  660.                        Remarks
  661.  
  662.                       The @OPTEXT@ macro is used to include operation specific text in
  663.                           prompts and display files.  Normally PCBoard automatically fills
  664.                           it in with the appropriate  value.  However, you can use  it for
  665.                           your own purposes by issuing  this statement to set the text and
  666.                           immediately  displaying the information  that should  use it (by
  667.                           either printing a line or displaying a file).
  668.                        Examples
  669.  
  670.                         OPTEXT STRING(DATE())+" & "+STRING(TIME())
  671.                         PRINTLN "The date and time are @OPTEXT@"
  672.                         DISPFILE "FILE",GRAPH+SEC+LANG
  673.  
  674.                    See Also
  675.  
  676.  
  677.  
  678.  
  679.  
  680.  
  681.  
  682.                           
  683.  
  684.  
  685.  
  686.                   OR()   Function
  687.  
  688.                    Function
  689.                       Calculate the bitwise OR of two integer arguments.
  690.  
  691.                        Syntax
  692.                       OR(iexp1,iexp2)
  693.                                 iexp1     Any integer expression.
  694.  
  695.                                 iexp2     Any integer expression.
  696.  
  697.                        Return Type & Value
  698.                       INTEGER     Returns the bitwise OR of iexp1 and iexp2.
  699.  
  700.                        Remarks
  701.                       This  function may be  used to  set selected bits  in an integer
  702.                           expression by ORing the expression with a mask that has the bits
  703.                           to set set to 1 and the bits to ignore set to 0.
  704.  
  705.                        Examples
  706.                         ' Set the bits in the low byte
  707.                         PRINTLN OR(1248h,00FFh)
  708.                         ' Randomly set a flag the hard way
  709.                         INTEGER flag
  710.                         LET flag = OR(RANDOM(1),RANDOM(1))
  711.  
  712.                    See Also
  713.  
  714.                       AND() Function, NOT() Function, XOR() Function
  715.  
  716.  
  717.  
  718.  
  719.  
  720.  
  721.  
  722.                           
  723.  
  724.  
  725.  
  726.                   O_RD   Constant
  727.  
  728.                    Function
  729.                       Set the  open for  read access flag  in a  FCREATE/FOPEN/FAPPEND
  730.                           statement.
  731.  
  732.                        Value
  733.                       0 = 0b = 0o = 0h
  734.  
  735.                        Remarks
  736.                       Files  may be  opened  for  read, write  or combined  read/write
  737.                           access.   You should only use the access you need to allow other
  738.                           processes to  open files at  the same time  in multitasking  and
  739.                           networked environments.   This constant  will allow your  PPE to
  740.                           read from a file without writing any information out to it.
  741.  
  742.                        Examples
  743.  
  744.                         FOPEN 1,"FILE.DAT",O_RD,S_DN ' Open for read access
  745.                         FOR i = 1 TO 10
  746.                           FGET 1,s
  747.                           PRINTLN s
  748.                         NEXT
  749.                         FCLOSE 1
  750.  
  751.                    See Also
  752.                       O_RW Constant, O_WR Constant
  753.  
  754.  
  755.  
  756.  
  757.  
  758.  
  759.  
  760.                           
  761.  
  762.  
  763.  
  764.                   O_RW   Constant
  765.  
  766.                    Function
  767.                       Set   the   open  for   read   and  write   access  flag   in  a
  768.                           FCREATE/FOPEN/FAPPEND statement.
  769.  
  770.                        Value
  771.                       2 = 10b = 2o = 2h
  772.  
  773.                        Remarks
  774.                       Files  may be  opened  for  read, write  or combined  read/write
  775.                           access.   You should only use the access you need to allow other
  776.                           processes to  open files at  the same time  in multitasking  and
  777.                           networked environments.   This constant  will allow your  PPE to
  778.                           both read from and write to a file without the need to close and
  779.                           reopen it between accesses.
  780.  
  781.                        Examples
  782.  
  783.                         FOPEN 1,"FILE.DAT",O_RW,S_DN ' Open for read and
  784.                         write access
  785.                         FOR i = 1 TO 10
  786.                           FPUT 1,"X"
  787.                           FGET 1,s
  788.                           PRINTLN s
  789.                         NEXT
  790.                         FCLOSE 1
  791.  
  792.                    See Also
  793.                       O_RD Constant, O_WR Constant
  794.  
  795.  
  796.  
  797.  
  798.  
  799.  
  800.  
  801.                           
  802.  
  803.  
  804.  
  805.                   O_WR   Constant
  806.  
  807.                    Function
  808.                       Set  the open for  write access flag  in a FCREATE/FOPEN/FAPPEND
  809.                           statement.
  810.  
  811.                        Value
  812.                       1 = 1b = 1o = 1h
  813.  
  814.                        Remarks
  815.                       Files  may be  opened  for  read, write  or combined  read/write
  816.                           access.   You should only use the access you need to allow other
  817.                           processes to  open files at  the same time  in multitasking  and
  818.                           networked environments.   This constant  will allow your  PPE to
  819.                           write to a file but will restrict read access.
  820.  
  821.                        Examples
  822.  
  823.                         FOPEN 1,"FILE.DAT",O_WR,S_DN ' Open for write
  824.                         access
  825.                         FOR i = 1 TO 10
  826.                           FPUTLN 1,"Line ",i
  827.                         NEXT
  828.                         FCLOSE 1
  829.  
  830.                    See Also
  831.                       O_RD Constant, O_RW Constant
  832.  
  833.  
  834.  
  835.  
  836.  
  837.  
  838.  
  839.                           
  840.  
  841.  
  842.  
  843.                   PAGEOFF   Statement
  844.  
  845.                    Function
  846.                       Turn off the SysOp paged indicator.
  847.  
  848.                        Syntax
  849.                       PAGEOFF
  850.                                 No arguments are required
  851.  
  852.                        Remarks
  853.  
  854.                       One of the  features of PCBoard where change is  often requested
  855.                           is the operator  page facility.  Some people want  to be able to
  856.                           configure multiple ranges  of availability per day,  some want a
  857.                           different sounding page bell,  longer or shorter page  attempts,
  858.                           etc,  etc.   This  statement, along  with  the CHAT  and  PAGEON
  859.                           statements and the PAGESTAT()  function, allow you to  implement
  860.                           an operator page in any way desired.
  861.                        Examples
  862.  
  863.                         PAGEON
  864.                         FOR i = 1 TO 10
  865.                           PRINT "@BEEP@"
  866.                           DELAY 18
  867.                           IF (KINKEY() = " ") THEN
  868.                             PAGEOFF
  869.                             SHELL TRUE,i,"SUPERCHT",""
  870.                             GOTO exit
  871.                           ENDIF
  872.                         NEXT
  873.                         :exit
  874.  
  875.                    See Also
  876.                       CHAT Statement, PAGEON Statement, PAGESTAT() Function
  877.  
  878.  
  879.  
  880.  
  881.  
  882.  
  883.  
  884.                           
  885.  
  886.  
  887.  
  888.                   PAGEON   Statement
  889.  
  890.                    Function
  891.                       Turn on the SysOp paged indicator and update user statistics.
  892.  
  893.                        Syntax
  894.                       PAGEON
  895.                                 No arguments are required
  896.  
  897.                        Remarks
  898.  
  899.                       One of the  features of PCBoard where change is  often requested
  900.                           is the operator  page facility.  Some people want  to be able to
  901.                           configure multiple ranges  of availability per day,  some want a
  902.                           different sounding page bell,  longer or shorter page  attempts,
  903.                           etc,  etc.   This  statement,  along with  the CHAT  and PAGEOFF
  904.                           statements and the PAGESTAT()  function, allow you to  implement
  905.                           an operator page  in any way desired.  Note  that this statement
  906.                           will also  update the current  callers statistics PSA  if it  is
  907.                           installed.
  908.                        Examples
  909.  
  910.                         PAGEON
  911.                         FOR i = 1 TO 10
  912.                           PRINT "@BEEP@"
  913.                           DELAY 18
  914.                           IF (KINKEY() = " ") THEN
  915.                             CHAT
  916.                             GOTO exit
  917.                           ENDIF
  918.                         NEXT
  919.                         :exit
  920.  
  921.                    See Also
  922.                       CHAT Statement, PAGEOFF Statement, PAGESTAT() Function
  923.  
  924.  
  925.  
  926.  
  927.  
  928.  
  929.  
  930.                           
  931.  
  932.  
  933.  
  934.                   PAGESTAT()   Function
  935.  
  936.                    Function
  937.                       Determine if the current user has paged the SysOp.
  938.  
  939.                        Syntax
  940.                       PAGESTAT()
  941.                                 No arguments are required
  942.  
  943.                        Return Type and Value
  944.  
  945.                       BOOLEAN     Returns TRUE if the user has paged  the SysOp, FALSE
  946.                           otherwise.
  947.                        Remarks
  948.  
  949.                       One of the  features of PCBoard where change is  often requested
  950.                           is  the operator page facility.  Some  people want to be able to
  951.                           configure  multiple ranges of availability per  day, some want a
  952.                           different sounding  page bell, longer or  shorter page attempts,
  953.                           etc,  etc.   This  function, along  with  the CHAT,  PAGEON  and
  954.                           PAGEOFF statements, allow  you to implement an  operator page in
  955.                           any way desired.
  956.                        Examples
  957.  
  958.                         IF (PAGESTAT()) THEN
  959.                           PRINTLN "You have already paged the SysOp,"
  960.                           PRINTLN "please be patient."
  961.                         ELSE
  962.                           PAGEON
  963.                           PRINTLN "The SysOp has been paged, continue"
  964.                         ENDIF
  965.  
  966.                    See Also
  967.                       CHAT Statement, PAGEOFF Statement, PAGEON Statement
  968.  
  969.  
  970.  
  971.  
  972.  
  973.  
  974.  
  975.                           
  976.  
  977.  
  978.  
  979.                   PCBDAT()   Function
  980.  
  981.                    Function
  982.                       Return the path and file name of the PCBOARD.DAT file.
  983.  
  984.                        Syntax
  985.                       PCBDAT()
  986.                                 No arguments are required
  987.  
  988.                        Return Type & Value
  989.  
  990.                       STRING      Returns  the path and  file name of  the PCBOARD.DAT
  991.                           file for the currnet node.
  992.                        Remarks
  993.  
  994.                       The PCBOARD.DAT  file is the  master confiuration file  for each
  995.                           node running PCBoard.  As  such, there are many useful pieces of
  996.                           information that can be obtained from it.  It is a standard text
  997.                           file with  one piece of information  per line.  You  may use the
  998.                           READLINE()  function to  read individual  pieces  of information
  999.                           from it.
  1000.                        Examples
  1001.  
  1002.                         STRING s
  1003.                         LET s = READLINE(PCBDAT(),1)
  1004.                         PRINTLN "PCBOARD.DAT version info - ",s
  1005.  
  1006.                    See Also
  1007.  
  1008.  
  1009.  
  1010.  
  1011.  
  1012.  
  1013.  
  1014.                           
  1015.  
  1016.  
  1017.  
  1018.                   PCBNODE()   Function
  1019.  
  1020.                    Function
  1021.                       Return the current node number.
  1022.  
  1023.                        Syntax
  1024.                       PCBNODE()
  1025.                                 No arguments are required
  1026.  
  1027.                        Return Type & Value
  1028.  
  1029.                       INTEGER     Returns the node number for the current node.
  1030.                        Remarks
  1031.  
  1032.                       You  may have  need to  know  what node  is in  use  for certain
  1033.                           applications (for example, to create temporary files with unique
  1034.                           names  or to restrict  features to a particular  node or nodes).
  1035.                           This function will return a number  from 1 to the maximum number
  1036.                           of nodes  allowed with a given  copy of PCBoard.   Note that the
  1037.                           node  number may not  be what is  defined in  PCBOARD.DAT if the
  1038.                           /FLOAT or /NODE switches are used.
  1039.                        Examples
  1040.  
  1041.                         STRING file
  1042.                         LET file = "TMP"+STRING(PCBNODE())+".$$$"
  1043.                         DELETE file
  1044.  
  1045.                    See Also
  1046.  
  1047.  
  1048.  
  1049.  
  1050.  
  1051.  
  1052.  
  1053.                           
  1054.  
  1055.  
  1056.  
  1057.                   PEEKB()   Function
  1058.  
  1059.                    Function
  1060.                       Return the value of a byte at a specified memory address.
  1061.  
  1062.                        Syntax
  1063.                       PEEKB(addr)
  1064.                                 addr An  integer expression with the  address of the byte
  1065.                           to peek.
  1066.  
  1067.                        Return Type & Value
  1068.  
  1069.                       INTEGER     Returns the value of the byte at addr.
  1070.                        Remarks
  1071.  
  1072.                       It is  sometimes necessary to  read values from  memory directly
  1073.                           (for example, from the system BIOS data segment).  This function
  1074.                           will  return  a byte  quantity (0-255)  from a  specified memory
  1075.                           address.
  1076.                        Examples
  1077.  
  1078.                         PRINTLN "The current video mode is
  1079.                         ",PEEKB(MKADDR(40h,49h))
  1080.  
  1081.                    See Also
  1082.                       MKADDR()  Function, PEEKDW() Function, PEEKW() Function, POKEB()
  1083.                           Function,   POKEDW()   Function,   POKEW()   Function,   VARADDR
  1084.                           Statement, VAROFF Statement, VARSEG Statement
  1085.  
  1086.  
  1087.  
  1088.  
  1089.  
  1090.  
  1091.  
  1092.                           
  1093.  
  1094.  
  1095.  
  1096.                   PEEKDW()   Function
  1097.  
  1098.                    Function
  1099.                       Return the value of a double word at a specified memory address.
  1100.  
  1101.                        Syntax
  1102.                       PEEKDW(addr)
  1103.                                 addr An integer expression with the address of the double
  1104.                           word to peek.
  1105.  
  1106.                        Return Type & Value
  1107.  
  1108.                       INTEGER     Returns the value of the double word at addr.
  1109.                        Remarks
  1110.  
  1111.                       It is  sometimes necessary to  read values from  memory directly
  1112.                           (for example, from the system BIOS data segment).  This function
  1113.                           will  return a  double  word quantity  as  a signed  integer  (-
  1114.                           2,147,483,648 - +2,147,483,647) from a specified memory address.
  1115.                        Examples
  1116.  
  1117.                         PRINTLN "Timer ticks since midnight =
  1118.                         ",PEEKDW(MKADDR(40h,6Ch))
  1119.  
  1120.                    See Also
  1121.                       MKADDR() Function, PEEKB()  Function, PEEKW() Function,  POKEB()
  1122.                           Function,   POKEDW()   Function,   POKEW()   Function,   VARADDR
  1123.                           Statement, VAROFF Statement, VARSEG Statement
  1124.  
  1125.  
  1126.  
  1127.  
  1128.  
  1129.  
  1130.  
  1131.                           
  1132.  
  1133.  
  1134.  
  1135.                   PEEKW()   Function
  1136.  
  1137.                    Function
  1138.                       Return the value of a word at a specified memory address.
  1139.  
  1140.                        Syntax
  1141.                       PEEKW(addr)
  1142.                                 addr An  integer expression with the  address of the word
  1143.                           to peek.
  1144.  
  1145.                        Return Type & Value
  1146.  
  1147.                       INTEGER     Returns the value of the word at addr.
  1148.                        Remarks
  1149.  
  1150.                       It is  sometimes necessary to  read values from  memory directly
  1151.                           (for example, from the system BIOS data segment).  This function
  1152.                           will  return a word quantity (0-65,535)  from a specified memory
  1153.                           address.
  1154.                        Examples
  1155.  
  1156.                         PRINTLN "The usable memory size is
  1157.                         ",PEEKW(MKADDR(40h,13h))
  1158.  
  1159.                    See Also
  1160.                       MKADDR()  Function, PEEKB() Function, PEEKDW() Function, POKEB()
  1161.                           Function,   POKEDW()   Function,   POKEW()   Function,   VARADDR
  1162.                           Statement, VAROFF Statement, VARSEG Statement
  1163.  
  1164.  
  1165.  
  1166.  
  1167.  
  1168.  
  1169.  
  1170.                           
  1171.  
  1172.  
  1173.  
  1174.                   POKEB   Statement
  1175.  
  1176.                    Function
  1177.                       Write a byte to a specified memory address.
  1178.  
  1179.                        Syntax
  1180.                       POKEB addr,value
  1181.                                 addr An integer expression with the address to write to.
  1182.  
  1183.                                 value     An integer expression  with the value to write
  1184.                           to addr.
  1185.  
  1186.                        Remarks
  1187.                       You may have need to write directly to memory from time to time.
  1188.                           This statement complements  the PEEKB() function and  allows you
  1189.                           to write a byte value (0-255) to a specific memory location.
  1190.                        Examples
  1191.  
  1192.                         BOOLEAN flag
  1193.                         INTEGER addr
  1194.                         VARADDR flag,addr
  1195.                         POKEB addr,TRUE ' Set the flag to TRUE the hard way
  1196.  
  1197.                    See Also
  1198.  
  1199.                       MKADDR() Function, PEEKB()  Function, PEEKDW() Function, PEEKW()
  1200.                           Function,   POKEDW()   Function,   POKEW()   Function,   VARADDR
  1201.                           Statement, VAROFF Statement, VARSEG Statement
  1202.  
  1203.  
  1204.  
  1205.  
  1206.  
  1207.  
  1208.  
  1209.                           
  1210.  
  1211.  
  1212.  
  1213.                   POKEDW   Statement
  1214.  
  1215.                    Function
  1216.                       Write a double word to a specified memory address.
  1217.  
  1218.                        Syntax
  1219.                       POKEDW addr,value
  1220.                                 addr An integer expression with the address to write to.
  1221.  
  1222.                                 value     An integer expression  with the value to write
  1223.                           to addr.
  1224.  
  1225.                        Remarks
  1226.                       You may have need to write directly to memory from time to time.
  1227.                           This statement complements the PEEKDW()  function and allows you
  1228.                           to write a  double word value (-2,147,483,648  - +2,147,483,647)
  1229.                           to a specific memory location.
  1230.                        Examples
  1231.  
  1232.                         MONEY   amt
  1233.                         INTEGER addr
  1234.                         VARADDR amt,addr
  1235.                         POKEDW addr,123456 ' Set amt to $1234.56 the hard
  1236.                         way
  1237.  
  1238.                    See Also
  1239.  
  1240.                       MKADDR() Function, PEEKB() Function, PEEKDW() Function,  PEEKW()
  1241.                           Function, POKEB() Function, POKEW() Function, VARADDR Statement,
  1242.                           VAROFF Statement, VARSEG Statement
  1243.  
  1244.  
  1245.  
  1246.  
  1247.  
  1248.  
  1249.  
  1250.                           
  1251.  
  1252.  
  1253.  
  1254.                   POKEW   Statement
  1255.  
  1256.                    Function
  1257.                       Write a word to a specified memory address.
  1258.  
  1259.                        Syntax
  1260.                       POKEW addr,value
  1261.                                 addr An integer expression with the address to write to.
  1262.  
  1263.                                 value     An integer expression  with the value to write
  1264.                           to addr.
  1265.  
  1266.                        Remarks
  1267.                       You may have need to write directly to memory from time to time.
  1268.                           This statement complements  the PEEKW() function and  allows you
  1269.                           to write a word value (0-65,535) to a specific memory location.
  1270.                        Examples
  1271.  
  1272.                         DATE    dob
  1273.                         INTEGER addr
  1274.                         VARADDR dob,addr
  1275.                         POKEW addr,MKDATE(1967,10,31) ' Set dob the hard
  1276.                         way
  1277.  
  1278.                    See Also
  1279.  
  1280.                       MKADDR() Function, PEEKB() Function,  PEEKDW() Function, PEEKW()
  1281.                           Function,   POKEB()   Function,   POKEDW()   Function,   VARADDR
  1282.                           Statement, VAROFF Statement, VARSEG Statement
  1283.  
  1284.  
  1285.  
  1286.  
  1287.  
  1288.  
  1289.  
  1290.                           
  1291.  
  1292.  
  1293.  
  1294.                   POP   Statement
  1295.  
  1296.                    Function
  1297.                       Pop the results of one or more expressions from a stack.
  1298.  
  1299.                        Syntax
  1300.                       POP var[,var]
  1301.                                 var  A  variable  of  any  type  in  which   to  retrieve
  1302.                           previously pushed expression.
  1303.  
  1304.                        Remarks
  1305.  
  1306.                       This  statement  will  retrieve  the  results  of  one  or  more
  1307.                           expressions  of any type from a  stack into a list of variables.
  1308.                           The values  should have  been previously  pushed with  the  PUSH
  1309.                           statement.   Together  PUSH and  POP can  be used  for parameter
  1310.                           passing, to create 'local' variables, or to reverse the order of
  1311.                           arguments.
  1312.                        Examples
  1313.  
  1314.                         INTEGER i, tc
  1315.                         STRING  s
  1316.                         LET tc = TOKCOUNT()
  1317.                         WHILE (TOKCOUNT() > 0) PUSH GETTOKEN() ' push them
  1318.                         in order
  1319.                         FOR i = 1 TO tc
  1320.                           POP s                                ' pop them
  1321.                         in reverse
  1322.                           PRINTLN s
  1323.                         NEXT
  1324.  
  1325.                         INTEGER i
  1326.                         FOR i = 1 TO 10
  1327.                           PRINT i," - "
  1328.                           GOSUB sub
  1329.                         NEXT
  1330.                         END
  1331.                         :sub
  1332.                         PUSH i                                 '
  1333.                         temporarily save i
  1334.                         LET i = i*i
  1335.                         PRINTLN i
  1336.                         POP i                                  ' restore
  1337.                         saved i
  1338.                         RETURN
  1339.  
  1340.                         INTEGER v
  1341.                         PRINT "A cube with dimensions 2X3X4"
  1342.                         PUSH 2,3,4                             ' pass
  1343.  
  1344.  
  1345.  
  1346.  
  1347.  
  1348.  
  1349.  
  1350.                       
  1351.  
  1352.                         pushed parameters
  1353.                         GOSUB vol
  1354.                         POP v                                  ' pop result
  1355.                         PRINTLN "has volume ",v
  1356.                         END
  1357.                         :vol
  1358.                         INTEGER w,h,d
  1359.                         POP d,h,w                              ' pop passed
  1360.                         parameter
  1361.                         PUSH w*h*d                             ' push
  1362.                         result
  1363.                         RETURN
  1364.  
  1365.                    See Also
  1366.                       PUSH Statement
  1367.  
  1368.  
  1369.  
  1370.  
  1371.  
  1372.  
  1373.  
  1374.                           
  1375.  
  1376.  
  1377.  
  1378.                   PPENAME()   Function
  1379.  
  1380.                    Function
  1381.                       Return the base name of an executing PPE file.
  1382.  
  1383.                        Syntax
  1384.                       PPENAME()
  1385.                                 No arguments are required
  1386.  
  1387.                        Return Type & Value
  1388.  
  1389.                       STRING      Returns  the  base   file  name  (without   path  or
  1390.                           extension) of the currently executing PPE.
  1391.                        Remarks
  1392.  
  1393.                       This function  will return  the  name of  the PPE  file that  is
  1394.                           running.   This can be useful when writing PPL applications that
  1395.                           will use data  files that you would like to  keep named the same
  1396.                           as  the parent application  regardless of what the  PPE name may
  1397.                           change to.
  1398.                        Examples
  1399.  
  1400.                         STRING s
  1401.                         FOPEN 1,PPEPATH()+PPENAME()+".CFG",O_RD,S_DN
  1402.                         FGET 1,s
  1403.                         FCLOSE 1
  1404.  
  1405.                    See Also
  1406.                       PPEPATH() Function
  1407.  
  1408.  
  1409.  
  1410.  
  1411.  
  1412.  
  1413.  
  1414.                           
  1415.  
  1416.  
  1417.  
  1418.                   PPEPATH()   Function
  1419.  
  1420.                    Function
  1421.                       Return the path of an executing PPE file.
  1422.  
  1423.                        Syntax
  1424.                       PPEPATH()
  1425.                                 No arguments are required
  1426.  
  1427.                        Return Type & Value
  1428.  
  1429.                       STRING      Returns the path (without file name or extension) of
  1430.                           the currently executing PPE.
  1431.                        Remarks
  1432.  
  1433.                       This function  will return  the  path of  the PPE  file that  is
  1434.                           running.   This can be useful when writing PPL applications that
  1435.                           will use files that you  would like to keep in the same location
  1436.                           as the  parent application regardless  of where the  PPE may  be
  1437.                           installed.
  1438.                        Examples
  1439.  
  1440.                         STRING s
  1441.                         FOPEN 1,PPEPATH()+PPENAME()+".CFG",O_RD,S_DN
  1442.                         FGET 1,s
  1443.                         FCLOSE 1
  1444.  
  1445.                    See Also
  1446.                       PPENAME() Function
  1447.  
  1448.  
  1449.  
  1450.  
  1451.  
  1452.  
  1453.  
  1454.                           
  1455.  
  1456.  
  1457.  
  1458.                   PRINT/PRINTLN   Statements
  1459.  
  1460.                    Function
  1461.                       Print (write)  a line to  the screen (with  an optional  newline
  1462.                           appended).
  1463.  
  1464.                        Syntax
  1465.                       P   R   I   N   T    e   x   p   [   ,   e   x   p   ]
  1466.  
  1467.                       -                o                r                -
  1468.  
  1469.                       PRINTLN [exp[,exp]]
  1470.                                 exp  An expression of any type  to evaluate and write  to
  1471.                           the screen.
  1472.  
  1473.                        Remarks
  1474.  
  1475.                       These statements will evalutate zero, one or more expressions of
  1476.                           any  type and  write the  results to  the display.   The PRINTLN
  1477.                           statement will append  a newline to the end of  the expressions;
  1478.                           PRINT will  not.   Note that  at least  one  expression must  be
  1479.                           specified for PRINT, unlike the PRINTLN statement which need not
  1480.                           have  any arguments passed to it.  Finally, both statements will
  1481.                           process all @ codes and display them as expected.
  1482.                        Examples
  1483.  
  1484.                         PRINT "The name of the currently running PPE file
  1485.                         is "
  1486.                         PRINTLN PPENAME(),"."
  1487.                         PRINT "The path where it is located is "
  1488.                         PRINTLN PPEPATH(),"."
  1489.                         PRINT "The date is ",DATE()," and the time is
  1490.                         ",TIME(),"."
  1491.                         PRINTLN
  1492.                         PRINT "@X1FThis is bright white on blue..."
  1493.                         PRINTLN "how do you like it @FIRST@"
  1494.  
  1495.                    See Also
  1496.                       MPRINT/MPRINTLN Statements, SPRINT/SPRINTLN Statements
  1497.  
  1498.  
  1499.  
  1500.  
  1501.  
  1502.  
  1503.  
  1504.                           
  1505.  
  1506.  
  1507.  
  1508.                   PROMPTSTR   Statement
  1509.  
  1510.                    Function
  1511.                       Prompt the user for a string of text in a specific format.
  1512.  
  1513.                        Syntax
  1514.                       PROMPTSTR prompt,var,len,valid,flags
  1515.                                 prompt    An integer expression  with the prompt  number
  1516.                           from PCBTEXT to display to the user.
  1517.  
  1518.                                 var  The variable in which to store the user's input.
  1519.                                 len  An integer expression with maximum length of text to
  1520.                           input.
  1521.  
  1522.                                 valid     A string expression with the  valid characters
  1523.                           that the user may enter.
  1524.                                 flags     An integer expression with flags to modify how
  1525.                           the statement works.
  1526.  
  1527.                        Remarks
  1528.                       This statement will accept a  string of input from the user,  up
  1529.                           to the  length defined.   The prompt  parameter will be  used to
  1530.                           find the prompt from PCBTEXT  (which includes the prompt  color)
  1531.                           to display  to the user.   Only  characters found  in the  valid
  1532.                           parameter will  be accepted.   However, the flags  parameter may
  1533.                           affect how prompt is displayed and the valid characters that are
  1534.                           accepted.  Individual  flags may  be added  together as  needed.
  1535.                           Several functions  exist to easily  specify commonly used  valid
  1536.                           character   masks.     They  are   MASK_ALNUM(),   MASK_ALPHA(),
  1537.                           MASK_ASCII(),   MASK_FILE(),   MASK_NUM(),   MASK_PATH(),    and
  1538.                           MASK_PWD().   Defined  flag  values are  AUTO,  DEFS,  ECHODOTS,
  1539.                           ERASELINE,  FIELDLEN,   GUIDE,  HIGHASCII,   LFAFTER,  LFBEFORE,
  1540.                           NEWLINE, NOCLEAR, STACKED, UPCASE, WORDWRAP, and YESNO.
  1541.  
  1542.                        Examples
  1543.                         BOOLEAN b
  1544.                         DATE    d
  1545.                         INTEGER i
  1546.                         MONEY   m
  1547.                         STRING  s
  1548.                         TIME    t
  1549.                         ' NOTE:  prompt 706 is used here for all
  1550.                         statements;
  1551.                         '        you may use any prompt you wish
  1552.                         PROMPTSTR 706,b,1,"10",LFBEFORE+NEWLINE
  1553.                         PROMPTSTR 706,d,8,"0123456789-",NEWLINE+NOCLEAR
  1554.                         PROMPTSTR 706,i,20,MASK_NUM(),NEWLINE
  1555.                         PROMPTSTR
  1556.                         706,m,9,MASK_NUM()+".",NEWLINE+DEFS+FIELDLEN
  1557.  
  1558.  
  1559.  
  1560.  
  1561.  
  1562.  
  1563.  
  1564.                       
  1565.  
  1566.                         PROMPTSTR
  1567.                         706,s,63,MASK_ASCII(),NEWLINE+FIELDLEN+GUIDE
  1568.                         PROMPTSTR 706,t,5,"0123456789"+":",NEWLINE+LFAFTER
  1569.                         PRINTLN b," ",d," ",i
  1570.                         PRINTLN m," ",s," ",t
  1571.  
  1572.                    See Also
  1573.                       INPUT   Statement,  INPUT...   Statement,   INPUTSTR  Statement,
  1574.                           INPUTTEXT Statement
  1575.  
  1576.  
  1577.  
  1578.  
  1579.  
  1580.  
  1581.  
  1582.                           
  1583.  
  1584.  
  1585.  
  1586.                   PSA()   Function
  1587.  
  1588.                    Function
  1589.                       Determine whether or not a given PSA is installed.
  1590.  
  1591.                        Syntax
  1592.                       PSA(num)
  1593.                                 num  An integer expression with the  number of the PSA to
  1594.                           check for the existence of.
  1595.  
  1596.                        Return Type & Value
  1597.  
  1598.                       BOOLEAN     Returns TRUE if the specified PSA exists or FALSE if
  1599.                           it doesn't exist for the following values of num:
  1600.                                 1     The Alias PSA;
  1601.                                 2     The Verification PSA.
  1602.  
  1603.                                 3     The Address PSA;
  1604.                                 4     The Password PSA;
  1605.                                 5     The Statistics PSA.
  1606.  
  1607.                                 6     The Notes PSA.
  1608.  
  1609.                        Remarks
  1610.                       This  function allows you  to determine  whether or  not a given
  1611.                           PCBoard Supported  Allocation (PSA) is  installed.  For  each of
  1612.                           the six PSAs it  will return TRUE if  installed or FALSE if  not
  1613.                           installed.  It is  useful when you want  to write a generic  PPL
  1614.                           application that will  access one or more  PSAs that may or  may
  1615.                           not be installed.
  1616.  
  1617.                        Examples
  1618.                         STRING ynStr(1)
  1619.                         LET ynStr(0) = "NO"
  1620.                         LET ynStr(1) = "YES"
  1621.                         PRINTLN "       Alias Support Enabled? 
  1622.                         ",ynStr(PSA(1))
  1623.                         PRINTLN "Verification Support Enabled? 
  1624.                         ",ynStr(PSA(2))
  1625.                         PRINTLN "     Address Support Enabled? 
  1626.                         ",ynStr(PSA(3))
  1627.                         PRINTLN "    Password Support Enabled? 
  1628.                         ",ynStr(PSA(4))
  1629.                         PRINTLN "  Statistics Support Enabled? 
  1630.                         ",ynStr(PSA(5))
  1631.                         PRINTLN "       Notes Support Enabled? 
  1632.                         ",ynStr(PSA(6))
  1633.  
  1634.                    See Also
  1635.  
  1636.  
  1637.  
  1638.  
  1639.  
  1640.  
  1641.  
  1642.                           
  1643.  
  1644.  
  1645.  
  1646.  
  1647.  
  1648.  
  1649.  
  1650.                           
  1651.  
  1652.  
  1653.  
  1654.                   PUSH   Statement
  1655.  
  1656.                    Function
  1657.                       Push (save) the results of one or more expressions on a stack.
  1658.  
  1659.                        Syntax
  1660.                       PUSH exp[,exp]
  1661.                                 exp  An expression of any type to evaluate and push.
  1662.  
  1663.                        Remarks
  1664.  
  1665.                       This  statement will  evalutate one or  more expressions  of any
  1666.                           type  and push the  results onto a stack  for temporary storage.
  1667.                           The  results of those  expressions may be retrieved  via the POP
  1668.                           statement.   Together  PUSH and  POP can  be used  for parameter
  1669.                           passing, to create 'local' variables, or to reverse the order of
  1670.                           arguments.
  1671.                        Examples
  1672.  
  1673.                         INTEGER i, tc
  1674.                         STRING  s
  1675.                         LET tc = TOKCOUNT()
  1676.                         WHILE (TOKCOUNT() > 0) PUSH GETTOKEN() ' push them
  1677.                         in order
  1678.                         FOR i = 1 TO tc
  1679.                           POP s                                ' pop them
  1680.                         in reverse
  1681.                           PRINTLN s
  1682.                         NEXT
  1683.  
  1684.                         INTEGER i
  1685.                         FOR i = 1 TO 10
  1686.                           PRINT i," - "
  1687.                           GOSUB sub
  1688.                         NEXT
  1689.                         END
  1690.                         :sub
  1691.                         PUSH i                                 '
  1692.                         temporarily save i
  1693.                         LET i = i*i
  1694.                         PRINTLN i
  1695.                         POP i                                  ' restore
  1696.                         saved i
  1697.                         RETURN
  1698.  
  1699.                         INTEGER v
  1700.                         PRINT "A cube with dimensions 2X3X4"
  1701.                         PUSH 2,3,4                             ' pass
  1702.                         pushed parameters
  1703.  
  1704.  
  1705.  
  1706.  
  1707.  
  1708.  
  1709.  
  1710.                       
  1711.  
  1712.                         GOSUB vol
  1713.                         POP v                                  ' pop result
  1714.                         PRINTLN "has volume ",v
  1715.                         END
  1716.                         :vol
  1717.                         INTEGER w,h,d
  1718.                         POP d,h,w                              ' pop passed
  1719.                         parameter
  1720.                         PUSH w*h*d                             ' push
  1721.                         result
  1722.                         RETURN
  1723.  
  1724.                    See Also
  1725.                       POP Statement
  1726.  
  1727.  
  1728.  
  1729.  
  1730.  
  1731.  
  1732.  
  1733.                           
  1734.  
  1735.  
  1736.  
  1737.                   PUTUSER   Statement
  1738.  
  1739.                    Function
  1740.                       Copy values from predeclared variables to user record.
  1741.  
  1742.                        Syntax
  1743.                       PUTUSER
  1744.                                 No arguments are required
  1745.  
  1746.                        Remarks
  1747.  
  1748.                       There are many predeclared variables which may be used to access
  1749.                           and  change  user  information.    However,   their  values  are
  1750.                           undefined until you  use the GETUSER statement,  and any changes
  1751.                           you make don't take hold until you use the PUTUSER statement.
  1752.                        Examples
  1753.  
  1754.                         IF (PSA(3)) THEN
  1755.                           GETUSER
  1756.                           INPUT "Addr 1",U_ADDR(0)
  1757.                           INPUT "Addr 2",U_ADDR(1)
  1758.                           INPUT "City  ",U_ADDR(2)
  1759.                           INPUT "State ",U_ADDR(3)
  1760.                           INPUT "ZIP   ",U_ADDR(4)
  1761.                           INPUT "Cntry ",U_ADDR(5)
  1762.                           PUTUSER
  1763.                         ENDIF
  1764.  
  1765.                    See Also
  1766.                       GETUSER Statement
  1767.  
  1768.  
  1769.  
  1770.  
  1771.  
  1772.  
  1773.  
  1774.                           
  1775.  
  1776.  
  1777.  
  1778.                   QUEST   Statement
  1779.  
  1780.                    Function
  1781.                       Allow the user to answer a specified script questionnaire.
  1782.  
  1783.                        Syntax
  1784.                       QUEST scrnum
  1785.                                 scrnum    The  number of  the  script  for the  user  to
  1786.                           answer.    Valid  values are  1  through  the  number  of script
  1787.                           questionnaires available.
  1788.  
  1789.                        Remarks
  1790.  
  1791.                       This  statement  will  present  the  user   a  specified  script
  1792.                           questionnaire  number  to  answer.   The  SCR.LST  file  for the
  1793.                           current  conference will  be searched  for the  script.   If the
  1794.                           questionnaire number is invalid (less than 1 or greater than the
  1795.                           highest script number defined) then nothing will be displayed.
  1796.                        Examples
  1797.  
  1798.                         INTEGER num
  1799.                         INPUT "Script to answer",num
  1800.                         QUEST num
  1801.  
  1802.                    See Also
  1803.  
  1804.  
  1805.  
  1806.  
  1807.  
  1808.  
  1809.  
  1810.                           
  1811.  
  1812.  
  1813.  
  1814.                   RANDOM()   Function
  1815.  
  1816.                    Function
  1817.                       Return a random value between 0 and a specified limit.
  1818.  
  1819.                        Syntax
  1820.                       RANDOM(limit)
  1821.                                 limit     An integer expression with  the maximum random
  1822.                           value desired.
  1823.  
  1824.                        Return Type & Value
  1825.  
  1826.                       INTEGER     Returns the random number in the range 0 to limit.
  1827.                        Remarks
  1828.  
  1829.                       Random numbers  have many applications from  statistics to video
  1830.                           games.    This function  allows  you  to generate  pseudo-random
  1831.                           numbers in the range 0 to limit inclusive.
  1832.                        Examples
  1833.  
  1834.                         INTEGER x,y
  1835.                         WHILE (KINKEY() <> " ") DO
  1836.                           CLS
  1837.                           LET x = 1+RANDOM(50)
  1838.                           LET y = 1+RANDOM(22)
  1839.                           COLOR 1+RANDOM(14)
  1840.                           ANSIPOS x,y
  1841.                           PRINT "Hit the SPACE BAR to continue"
  1842.                           DELAY 18
  1843.                           ANSIPOS x,y
  1844.                           CLREOL
  1845.                         ENDWHILE
  1846.  
  1847.                    See Also
  1848.  
  1849.  
  1850.  
  1851.  
  1852.  
  1853.  
  1854.  
  1855.                           
  1856.  
  1857.  
  1858.  
  1859.                   RDUNET   Statement
  1860.  
  1861.                    Function
  1862.                       Read information from the USERNET file for a specific node.
  1863.  
  1864.                        Syntax
  1865.                       RDUNET node
  1866.                                 node An integer expression with the node to read.
  1867.  
  1868.                        Remarks
  1869.  
  1870.                       To facilitate internode communications, a file named USERNET.XXX
  1871.                           is maintained with  an entry for each node on  the system.  This
  1872.                           file is used  by the BROADCAST command of PCBoard and to prevent
  1873.                           multiple  simultaneous   logins,  among  other   things.    This
  1874.                           statement may be used to read information for any node.
  1875.                        Examples
  1876.  
  1877.                         RDUNET PCBNODE()
  1878.                         WRUNET
  1879.                         PCBNODE(),UN_STAT(),UN_NAME(),UN_CITY(),"Running
  1880.                         "+PPENAME(),""
  1881.                         RDUNET 1
  1882.                         WRUNET
  1883.                         1,UN_STAT(),UN_NAME(),UN_CITY(),UN_OPER(),"Hello
  1884.                         there node 1"
  1885.  
  1886.                    See Also
  1887.                       UN_...() Function, RDUNET Statement
  1888.  
  1889.  
  1890.  
  1891.  
  1892.  
  1893.  
  1894.  
  1895.                           
  1896.  
  1897.  
  1898.  
  1899.                   RDUSYS   Statement
  1900.  
  1901.                    Function
  1902.                       Read a USERS.SYS file in from disk.
  1903.  
  1904.                        Syntax
  1905.                       RDUSYS
  1906.                                 No arguments are required
  1907.  
  1908.                        Remarks
  1909.  
  1910.                       Some  DOOR  applications  require  a  USERS.SYS  file  to access
  1911.                           information about the caller.  This statement allows you to read
  1912.                           the USERS.SYS  file back into  memory in case  any changes  were
  1913.                           made by  the DOOR during  the SHELL statement.   This  statement
  1914.                           should only be  used after a SHELL statement that  was preceeded
  1915.                           by a WRUSYS statement.
  1916.                        Examples
  1917.  
  1918.                         INTEGER ret
  1919.                         WRUSYS
  1920.                         SHELL FALSE,ret,"MYAPP.EXE",""
  1921.                         RDUSYS
  1922.  
  1923.                    See Also
  1924.                       WRUSYS Statement
  1925.  
  1926.  
  1927.  
  1928.  
  1929.  
  1930.  
  1931.  
  1932.                           
  1933.  
  1934.  
  1935.  
  1936.                   READLINE()   Function
  1937.  
  1938.                    Function
  1939.                       Read a specific line number from a text file.
  1940.  
  1941.                        Syntax
  1942.                       READLINE(file,line)
  1943.                                 file A string expression with the file name to read from.
  1944.  
  1945.                                 line An integer expression with the line number to read.
  1946.  
  1947.                        Return Type & Value
  1948.                       STRING      Returns the specified line number from file.
  1949.  
  1950.                        Remarks
  1951.                       It is often convienient to  read a specified line number  from a
  1952.                           file without going to  all the overhead of opening, reading  and
  1953.                           closing.   This  function will  open the file  in read  mode for
  1954.                           share deny none  access and quickly  read up to the  line number
  1955.                           you specify.  If the line you want doesn't exist an empty string
  1956.                           will be returned.  Additionally, this function will remember the
  1957.                           last file and line read so that it may quickly continue where it
  1958.                           left off if you try to read a  number of lines sequentially from
  1959.                           the  same file.   Finally, the  last file specified  will remain
  1960.                           open until the PPE exits and returns control to PCBoard.
  1961.  
  1962.                        Examples
  1963.                         PRINTLN "This system is running on IRQ
  1964.                         ",READLINE(PCBDAT(),158)
  1965.                         PRINTLN "with a base IO address of
  1966.                         ",READLINE(PCBDAT(),159)
  1967.  
  1968.                    See Also
  1969.  
  1970.  
  1971.  
  1972.  
  1973.  
  1974.  
  1975.  
  1976.                           
  1977.  
  1978.  
  1979.  
  1980.                   REG...()   Functions
  1981.  
  1982.                    Function
  1983.                       Get the value of a register.
  1984.  
  1985.                        Syntax
  1986.                       REG...()
  1987.                                 No arguments are required
  1988.  
  1989.                           REG should be  followed by one of the following  register names:
  1990.                           AH, AL, AX, BH, BL, BX, CF, CH,  CL, CX, DH, DI, DL, DS, DX, ES,
  1991.                           F or SI.
  1992.                        Return Type & Value
  1993.  
  1994.                       BOOLEAN     (REGCF() only)  Returns TRUE  if the  carry flag  is
  1995.                           set, FALSE otherwise.
  1996.                           INTEGER     (All  others)  Returns the  value  in  the specified
  1997.                           register.
  1998.  
  1999.                        Remarks
  2000.                       There are actually 18 different functions that return the values
  2001.                           of registers.   AL, AH, BL, BH, CL,  CH, DL, and DH  will always
  2002.                           return byte sized values (0-255).   AX, BX, CX, DX, DI, SI,  DS,
  2003.                           and  ES  will always  return  word sized  values  (0-65535).   F
  2004.                           (flags) returns  the settings  for the  various 80x86  processor
  2005.                           flags.  CF is a subset of  F in that it only returns  the status
  2006.                           of the  carry flag.  It  exists because the carry  flag is often
  2007.                           used  to report  success or failure  in assembly language.   The
  2008.                           REGF() function  returns the settings  for the  following flags:
  2009.                           Carry,   Parity,  Auxilliary,   Zero,  Sign,   Trap,  Interrupt,
  2010.                           Direction, and Overflow.  Their bit positions are as follows:
  2011.  
  2012.  
  2013.                                    O   D    I   T    S    Z   -    A   -   P    -    C
  2014.  
  2015.                                   80    40    20    10    08    04    02    01    00    00    00    00
  2016.                                                 0h   0h   0h   0h   0h   0h   0h   0h   8h   4h  2h   1h
  2017.  
  2018.  
  2019.                        Examples
  2020.  
  2021.                         ' Create subdirectory - DOS function 39h
  2022.                         INTEGER addr
  2023.                         STRING  path
  2024.                         LET path = "C:\$TMPDIR$"
  2025.                         VARADDR path,addr
  2026.                         DOINTR
  2027.                         21h,39h,0,0,addr%00010000h,0,0,0,addr/00010000h,0
  2028.                         IF (REGCF() & (REGAX() = 3)) THEN
  2029.  
  2030.  
  2031.  
  2032.  
  2033.  
  2034.  
  2035.  
  2036.                       
  2037.  
  2038.                           PRINTLN "Error:  Path not found"
  2039.                         ELSE IF (REGCF() & (REGAX() = 5)) THEN
  2040.                           PRINTLN "Error:  Access Denied"
  2041.                         ELSE IF (REGCF()) THEN
  2042.                           PRINTLN "Error:  Unknown Error"
  2043.                         ELSE
  2044.                           PRINTLN "Directory successfully created..."
  2045.                         ENDIF
  2046.  
  2047.                    See Also
  2048.                       B2W()  Function,  DOINTR  Statement,  VARADDR Statement,  VAROFF
  2049.                           Statement, VARSEG Statement
  2050.  
  2051.  
  2052.  
  2053.  
  2054.  
  2055.  
  2056.  
  2057.                           
  2058.  
  2059.  
  2060.  
  2061.                   RENAME   Statement
  2062.  
  2063.                    Function
  2064.                       Rename (or move) a file.
  2065.  
  2066.                        Syntax
  2067.                       RENAME old,new
  2068.                                 old  A string  expression with the  old path  and/or file
  2069.                           name.
  2070.  
  2071.                                 new  A  string expression with  the new  path and/or file
  2072.                           name.
  2073.  
  2074.                        Remarks
  2075.                       Similar  to how  the RENAME command  works from the  DOS prompt,
  2076.                           this statement will take a file and give it  a new name.  Unlike
  2077.                           the  RENAME  command,  the  RENAME  statement  will  not  accept
  2078.                           wildcards  in  the old  or  new parameters.    Also, it  doesn't
  2079.                           require that  the old  path and the  new path  be the  same (the
  2080.                           drive letters must match, but the  paths need not), so it may be
  2081.                           used  to move  files from  one location to  another on  a single
  2082.                           drive.  So, you could use it to move a file from C:\PCB\NODE1 to
  2083.                           C:\PCB\NODE2 (renaming it at the same time if you wish), but you
  2084.                           couldn't  use   it  to   move  a   file  from   C:\PCB\NODE1  to
  2085.                           D:\WORK\NODE1.
  2086.                        Examples
  2087.  
  2088.                         ' Swap the PCBOARD DAT & NXT files
  2089.                         RENAME "PCBOARD.DAT","PCBOARD.TMP"
  2090.                         RENAME "PCBOARD.NXT","PCBOARD.DAT"
  2091.                         RENAME "PCBOARD.TMP","PCBOARD.NXT"
  2092.  
  2093.                         ' Move the file to the backup directory
  2094.                         RENAME
  2095.                         "PPE.LOG","LOGBAK\"+I2S(DATE()*86400+TIME(),36)
  2096.  
  2097.                    See Also
  2098.  
  2099.  
  2100.  
  2101.  
  2102.  
  2103.  
  2104.  
  2105.                           
  2106.  
  2107.  
  2108.  
  2109.                   REPLACE()   Function
  2110.  
  2111.                    Function
  2112.                       Change all occurences of a given character to another  character
  2113.                           in a string.
  2114.  
  2115.                        Syntax
  2116.                       REPLACE(str,old,new)
  2117.                                 str  Any string expression.
  2118.  
  2119.                                 old  A  string expression  with the  old character  to be
  2120.                           replaced.
  2121.                                 new  A  string  expression  with  the  new  character  to
  2122.                           replace with.
  2123.  
  2124.                        Return Type & Value
  2125.                       STRING      Returns str  with all occurences  of old  changed to
  2126.                           new.
  2127.  
  2128.                        Remarks
  2129.                       This function  will search  a string for  a given character  and
  2130.                           replace all instances of that character  with another character.
  2131.                           This can be useful in many scenarios, especially when formatting
  2132.                           text for display purposes.
  2133.  
  2134.                        Examples
  2135.  
  2136.                         PRINTLN "Your internet address on this system is:"
  2137.                         PRINTLN REPLACE(LOWER(U_NAME()),"
  2138.                         ","."),"@clarkdev.com"
  2139.  
  2140.                    See Also
  2141.  
  2142.  
  2143.  
  2144.  
  2145.  
  2146.  
  2147.  
  2148.                           
  2149.  
  2150.  
  2151.  
  2152.                   RESETDISP   Statement
  2153.  
  2154.                    Function
  2155.                       Reset the display to allow more information after an abort.
  2156.  
  2157.                        Syntax
  2158.                       RESETDISP
  2159.                                 No arguments are required
  2160.  
  2161.                        Remarks
  2162.  
  2163.                       PCBoard normally  automatically counts  lines and,  if  enabled,
  2164.                           pauses  the display after every screenful.  The user may (unless
  2165.                           disabled) abort  the display at  any MORE? prompt  or with  the
  2166.                           ^K/^X  keys.   If this  happens no  further information  will be
  2167.                           displayed  until you use the RESETDISP statement.  You can check
  2168.                           to  see if RESETDISP is necessary (ie,  has the user aborted the
  2169.                           display) with the ABORT() function.
  2170.                        Examples
  2171.  
  2172.                         INTEGER I
  2173.                         STARTDISP FCL
  2174.                         ' While the user has not aborted, continue
  2175.                         WHILE (!ABORT()) DO
  2176.                           PRINTLN "I is equal to ",I
  2177.                           INC I
  2178.                         ENDWHILE
  2179.                         RESETDISP
  2180.  
  2181.                    See Also
  2182.                       ABORT() Function, STARTDISP Statement
  2183.  
  2184.  
  2185.  
  2186.  
  2187.  
  2188.  
  2189.  
  2190.                           
  2191.  
  2192.  
  2193.  
  2194.                   RESTSCRN   Statement
  2195.  
  2196.                    Function
  2197.                       Restore the screen from a previously saved buffer.
  2198.  
  2199.                        Syntax
  2200.                       RESTSCRN
  2201.                                 No arguments are required
  2202.  
  2203.                        Remark
  2204.  
  2205.                       PCBoard  will  save and  restore  the  screen before  and  after
  2206.                           certain  functions, such as SysOp chat.  This allows the user to
  2207.                           continue right where he left off without having to remember what
  2208.                           was on  the screen before being  interrupted.  You  can add that
  2209.                           same functionality  with the SAVESCRN  and RESTSCRN  statements.
  2210.                           The SAVESCRN statement allocates memory for a buffer in which to
  2211.                           save the screen.  If the SAVESCRN statement isn't followed by  a
  2212.                           RESTSCRN statement then that  memory will never be  deallocated.
  2213.                           Finally,   this   statement   will  work   regardless   of  ANSI
  2214.                           availability; the screen is only saved up to the position of the
  2215.                           cursor and this statement assumes that it can safely restore the
  2216.                           screen  using standard teletype  conventions to  just scroll the
  2217.                           data onto the display.
  2218.                        Examples
  2219.  
  2220.                         SAVESCRN
  2221.                         CLS
  2222.                         PRINTLN "We interrupt your regular BBS session"
  2223.                         PRINTLN "with this important message:"
  2224.                         NEWLINE
  2225.                         PRINTLN "A subscription to this system only costs
  2226.                         $5!"
  2227.                         PRINTLN "Subscribe today!"
  2228.                         NEWLINES 2
  2229.                         WAIT
  2230.                         RESTSCRN
  2231.  
  2232.                    See Also
  2233.                       SAVESCRN Statement
  2234.  
  2235.  
  2236.  
  2237.  
  2238.  
  2239.  
  2240.  
  2241.                           
  2242.  
  2243.  
  2244.  
  2245.                   RETURN   Statement
  2246.  
  2247.                    Function
  2248.                       Transfer program control back to a previously saved address.
  2249.  
  2250.                        Syntax
  2251.                       RETURN
  2252.                                 No arguments are required
  2253.  
  2254.                        Remarks
  2255.  
  2256.                       It  is   often  necessary  to  perform  an   indentical  set  of
  2257.                           instructions several times  in a program.  This leaves  you with
  2258.                           two choices.   One, rewrite the code several times (and hope you
  2259.                           do  it right each time), or two,  write it once as a subroutine,
  2260.                           then use GOSUB to run it.  This statement will save  the address
  2261.                           of the next line so  that a RETURN statement  at the end of  the
  2262.                           subroutine can instruct  PPL to resume  execution with the  line
  2263.                           following the GOSUB.
  2264.                        Examples
  2265.  
  2266.                         STRING Question, Answer
  2267.                         LET Question = "What is your street address ..."
  2268.                         GOSUB ask
  2269.                         LET Question = "What is your city, state and zip
  2270.                         ..."
  2271.                         GOSUB ask
  2272.                         END
  2273.  
  2274.                         :ask ' Sub to ask a question, get an answer, and
  2275.                         log them to a file
  2276.                         LET Answer = ""
  2277.                         PRINTLN "@X0E",Question
  2278.                         INPUT "",Answer
  2279.                         NEWLINES 2
  2280.                         FPUTLN 0,"Q: ",STRIPATX(Question)
  2281.                         FPUTLN 0,"A: ",Answer
  2282.                         RETURN
  2283.  
  2284.                    See Also
  2285.                       END Statement, GOSUB Statement, GOTO Statement, STOP Statement
  2286.  
  2287.  
  2288.  
  2289.  
  2290.  
  2291.  
  2292.  
  2293.                           
  2294.  
  2295.  
  2296.  
  2297.                   RIGHT()   Function
  2298.  
  2299.                    Function
  2300.                       Access the right most characters from a string.
  2301.  
  2302.                        Syntax
  2303.                       RIGHT(str,chars)
  2304.                                 str  A   string  expression  to   take  the   right  most
  2305.                           characters of.
  2306.  
  2307.                                 chars     An  integer  expression  with  the  number  of
  2308.                           characters to take from the right end of str.
  2309.  
  2310.                        Return Type & Value
  2311.                       STRING      Returns  a   string  with   the  right   most  chars
  2312.                           characters of str.
  2313.  
  2314.                        Remarks
  2315.                       This function will return a sub string with the right most chars
  2316.                           characters of  a specified string.   This can be  useful in data
  2317.                           processing as well as text formatting.  If chars is less than or
  2318.                           equal to 0 then the returned string will be empty.   If chars is
  2319.                           greater  than the  length of str  then the returned  string will
  2320.                           have spaces added to the right to pad  it out to the full length
  2321.                           specified.
  2322.  
  2323.                        Examples
  2324.                         WHILE (RANDOM(250) <> 0) PRINT
  2325.                         RIGHT(RANDOM(250),4)," "
  2326.  
  2327.                         STRING s
  2328.                         FOPEN 1,"DATA.TXT",O_RD,S_DN
  2329.                         WHILE (!FERR(1)) DO
  2330.                           FGET 1,s
  2331.                           PRINT RTRIM(LEFT(s,25)," ")," - "
  2332.                           PRINTLN RIGHT(s,LEN(s)-25)
  2333.                         ENDWHILE
  2334.                         FCLOSE 1
  2335.  
  2336.                    See Also
  2337.  
  2338.                       LEFT() Function, MID() Function
  2339.  
  2340.  
  2341.  
  2342.  
  2343.  
  2344.  
  2345.  
  2346.                           
  2347.  
  2348.  
  2349.  
  2350.                   RTRIM()   Function
  2351.  
  2352.                    Function
  2353.                       Trim a specified character from the right end of a string.
  2354.  
  2355.                        Syntax
  2356.                       RTRIM(str,ch)
  2357.                                 str  Any string expression.
  2358.  
  2359.                                 ch   A string with the character to  strip from the right
  2360.                           end of str.
  2361.  
  2362.                        Return Type & Value
  2363.                       STRING      Returns the trimmed str.
  2364.  
  2365.                        Remarks
  2366.                       A common need in programming is to strip leading and/or trailing
  2367.                           spaces (or  other  characters).   This  function  will  strip  a
  2368.                           specified character  from the right  end of a string  and return
  2369.                           the trimmed string.
  2370.  
  2371.                        Examples
  2372.                         STRING s
  2373.                         LET s = "   TEST   "
  2374.                         PRINTLN RTRIM(s," ") ' Will print "   TEST"
  2375.                         PRINTLN RTRIM(".....DA"+"TA.....",".") ' Will print
  2376.                         ".....DATA"
  2377.                         PRINTLN RTRIM(".....DA"+"TA....."," ") ' Will print
  2378.                         ".....DATA....."
  2379.  
  2380.                    See Also
  2381.  
  2382.                       LTRIM() Function, TRIM() Function
  2383.  
  2384.  
  2385.  
  2386.  
  2387.  
  2388.  
  2389.  
  2390.                           
  2391.  
  2392.  
  2393.  
  2394.                   S2I()   Function
  2395.  
  2396.                    Function
  2397.                       Convert a string in a specified number base to an integer.
  2398.  
  2399.                        Syntax
  2400.                       S2I(str,base)
  2401.                                 str  Any string expression to convert to integer format.
  2402.  
  2403.                                 base An  integer  expression  with  the  number  base  (2
  2404.                           through 36) to convert from.
  2405.  
  2406.                        Return Type & Value
  2407.                       INTEGER     Returns str converted from the specified number base
  2408.                           to an integer.
  2409.  
  2410.                        Remarks
  2411.                       People work  with decimal (base  10) numbers,  whereas computers
  2412.                           work with binary (base 2) numbers.  It is often more convienient
  2413.                           to store  or input  numbers in a  format other than  decimal for
  2414.                           clarity,  compactness,  or other  reasons.   This  function will
  2415.                           convert a string  in any number base from  2 to 36 to  a number.
  2416.                           So, S2I("1010",2)  would return a  10; S2I("Z",36)  would return
  2417.                           35.  For more information on number bases, consult .
  2418.  
  2419.                        Examples
  2420.                         INTEGER i
  2421.                         STRING  s
  2422.                         INPUTTEXT "Enter a string (any base)",s,@X0E,40
  2423.                         FOR i = 2 TO 36
  2424.                           PRINTLN s," = ",S2I(s,i)," base ",i
  2425.                         NEXT
  2426.  
  2427.                    See Also
  2428.  
  2429.                       I2S() Function
  2430.  
  2431.  
  2432.  
  2433.  
  2434.  
  2435.  
  2436.  
  2437.                           
  2438.  
  2439.  
  2440.  
  2441.                   SAVESCRN   Statement
  2442.  
  2443.                    Function
  2444.                       Save the screen to a buffer for later restoration.
  2445.  
  2446.                        Syntax
  2447.                       SAVESCRN
  2448.                                 No arguments are required
  2449.  
  2450.                        Remark
  2451.  
  2452.                       PCBoard  will  save and  restore  the  screen before  and  after
  2453.                           certain  functions, such as SysOp chat.  This allows the user to
  2454.                           continue right where he left off without having to remember what
  2455.                           was on  the screen before being  interrupted.  You  can add that
  2456.                           same functionality  with the SAVESCRN  and RESTSCRN  statements.
  2457.                           The SAVESCRN statement allocates memory for a buffer in which to
  2458.                           save the screen.  If the SAVESCRN statement isn't followed by  a
  2459.                           RESTSCRN statement then that  memory will never be  deallocated.
  2460.                           Finally,   this   statement   will  work   regardless   of  ANSI
  2461.                           availability; this statement will only save the screen up to the
  2462.                           position of the cursor.   It is assumed  that the screen can  be
  2463.                           safely  restored using  standard  teletype conventions  to  just
  2464.                           scroll the data onto the display.
  2465.                        Examples
  2466.  
  2467.                         SAVESCRN
  2468.                         CLS
  2469.                         PRINTLN "We interrupt your regular BBS session"
  2470.                         PRINTLN "with this important message:"
  2471.                         NEWLINE
  2472.                         PRINTLN "A subscription to this system only costs
  2473.                         $5!"
  2474.                         PRINTLN "Subscribe today!"
  2475.                         NEWLINES 2
  2476.                         WAIT
  2477.                         RESTSCRN
  2478.  
  2479.                    See Also
  2480.                       RESTSCRN Statement
  2481.  
  2482.  
  2483.  
  2484.  
  2485.  
  2486.  
  2487.  
  2488.                           
  2489.  
  2490.  
  2491.  
  2492.                   SCRTEXT()   Function
  2493.  
  2494.                    Function
  2495.                       Access text  and attribute information directly  from BBS screen
  2496.                           memory.
  2497.  
  2498.                        Syntax
  2499.                       SCRTEXT(x,y,len,color)
  2500.                                 x    An integer expression with the x coordinate (column)
  2501.                           from which to read screen memory.
  2502.  
  2503.                                 y    An integer expression  with the  y coordinate  (row)
  2504.                           from which to read screen memory.
  2505.                                 len  An  integer expression with the  length, in columns,
  2506.                           of the string to read from screen memory.
  2507.  
  2508.                                 color     A  boolean  expression   with  TRUE  if  color
  2509.                           information should be included, FALSE otherwise.
  2510.                        Return Type & Value
  2511.  
  2512.                       STRING      Returns the specified region of screen memory.
  2513.  
  2514.                        Remarks
  2515.                       This function  is useful  for temporarily  saving a  portion  of
  2516.                           screen memory, with or without  color information.  If the color
  2517.                           parameter is set  to TRUE color information  will be included in
  2518.                           the form  of @X  codes embedded  in  the text.   Note  that  the
  2519.                           maximum length of a string is  256 characters; however, a row of
  2520.                           80  characters could be as  long as 400 characters  (4 bytes for
  2521.                           the @X code  and 1 byte for  the character itself).   You should
  2522.                           generally limit yourself to a length of 51 characters or less if
  2523.                           you want  to include  color information  unless you  are certain
  2524.                           that attribute changes will not  exceed the 256 character string
  2525.                           limit.
  2526.                        Examples
  2527.  
  2528.                         ' scroll the screen to the left 5 columns and down
  2529.                         3 rows
  2530.                         INTEGER r
  2531.                         STRING  s
  2532.                         FOR r = 20 TO 1 STEP -1
  2533.                           LET s = SCRTEXT(6,r,75,TRUE)
  2534.                           ANSIPOS 1,r+3
  2535.                           CLREOL
  2536.                           PRINT s
  2537.                         NEXT
  2538.                         FOR r = 1 TO 3
  2539.                           ANSIPOS 1,r
  2540.                           CLREOL
  2541.  
  2542.  
  2543.  
  2544.  
  2545.  
  2546.  
  2547.  
  2548.                       
  2549.  
  2550.                         NEXT
  2551.  
  2552.                    See Also
  2553.  
  2554.  
  2555.  
  2556.  
  2557.  
  2558.  
  2559.  
  2560.                           
  2561.  
  2562.  
  2563.  
  2564.                   SEC   Constant
  2565.  
  2566.                    Function
  2567.                       Set the security  level specific file search flag in  a DISPFILE
  2568.                           statement.
  2569.  
  2570.                        Value
  2571.                       2 = 10b = 2o = 2h
  2572.  
  2573.                        Remarks
  2574.                       The DISPFILE statement will  allow you to display a  file to the
  2575.                           user,  and  optionally  to  have  PCBoard  look  for   alternate
  2576.                           security, graphics,  and/or language specific files.   This flag
  2577.                           instructs PCBoard  to search for alternate  security level files
  2578.                           via the security  level suffix.  The current security  level may
  2579.                           be obtained with the CURSEC() function.
  2580.  
  2581.                        Examples
  2582.  
  2583.                         STRING s
  2584.                         DISPFILE "MNUA",SEC+GRAPH+LANG
  2585.                         INPUT "Option",s
  2586.  
  2587.                    See Also
  2588.                       CURSEC()  Function,  DISPFILE  Statement,  GRAPH  Constant, LANG
  2589.                           Constant
  2590.  
  2591.  
  2592.  
  2593.  
  2594.  
  2595.  
  2596.  
  2597.                           
  2598.  
  2599.  
  2600.  
  2601.                   SEC()   Function
  2602.  
  2603.                    Function
  2604.                       Extract the second of the minute from a specified time of day.
  2605.  
  2606.                        Syntax
  2607.                       SEC(texp)
  2608.                                 texp Any time expression.
  2609.  
  2610.                        Return Type & Value
  2611.  
  2612.                       INTEGER     Returns  the second of the minute from the specified
  2613.                           time expression (texp).  Valid return values are from 0 to 59.
  2614.                        Remarks
  2615.  
  2616.                       This  function  allows you  to  extract  a  particular piece  of
  2617.                           information about a  TIME value, in this case  the second of the
  2618.                           minute of the time of day expression.
  2619.                        Examples
  2620.  
  2621.                         PRINTLN "The minute is ",SEC(TIME())
  2622.  
  2623.                    See Also
  2624.                       HOUR() Function, MIN() Function
  2625.  
  2626.  
  2627.  
  2628.  
  2629.  
  2630.  
  2631.  
  2632.                           
  2633.  
  2634.  
  2635.  
  2636.                   SENDMODEM   Statement
  2637.  
  2638.                    Function
  2639.                       Send a string to the modem.
  2640.  
  2641.                        Syntax
  2642.                       SENDMODEM str
  2643.                                 str  A string expression to send to the modem.
  2644.  
  2645.                        Remarks
  2646.  
  2647.                       The primary use of this statement is to send commands to a modem
  2648.                           when  no one is online.  For example, you would use this to send
  2649.                           a dial  command to  the modem  in a  call back PPL  application.
  2650.                           However,  it is not  restricted to sending commands.   Note that
  2651.                           modem  commands must be terminated by a carriage return and that
  2652.                           this  statement  will not  automatically  do it  for you.   This
  2653.                           allows you to  send a command to the modem is several stages and
  2654.                           only terminate the final stage with a carriage return.
  2655.                        Examples
  2656.  
  2657.                         BOOLEAN flag
  2658.                         CDCHKOFF
  2659.                         KBDCHKOFF
  2660.                         DTROFF
  2661.                         DELAY 18
  2662.                         DTRON
  2663.                         SENDMODEM "ATDT"
  2664.                         SENDMODEM "5551212"
  2665.                         SENDMODEM CHR(13)
  2666.                         WAITFOR "CONNECT",flag,60
  2667.                         IF (!flag) LOG "No CONNECT after 60 seconds",FALSE
  2668.                         KBDCHKON
  2669.                         CDCHKON
  2670.  
  2671.                    See Also
  2672.  
  2673.  
  2674.  
  2675.  
  2676.  
  2677.  
  2678.  
  2679.                           
  2680.  
  2681.  
  2682.  
  2683.                   SHELL   Statement
  2684.  
  2685.                    Function
  2686.                       Shell out to a program or batch file.
  2687.  
  2688.                        Syntax
  2689.                       SHELL viacc,retcode,prog,cmds
  2690.                                 viacc     A  boolean expression with  value TRUE  if the
  2691.                           shell should  be made  via COMMAND.COM;  FALSE if  it should  be
  2692.                           shelled to directly.
  2693.  
  2694.                                 retcode   A variable in which to store the return code.
  2695.                                 prog A string expression with the file name to shell to.
  2696.  
  2697.                                 cmds A string  expression with  any arguments to  pass to
  2698.                           prog.
  2699.                        Remarks
  2700.  
  2701.                       You may have  have need to run a COM, EXE or  BAT file from your
  2702.                           PPE.   You may need to do  this to simulate running a DOOR or to
  2703.                           access some service not  normally available from PCBoard or PPL.
  2704.                           This function will allow you to do that.  If the viacc parameter
  2705.                           is TRUE (you  want COMMAND.COM to load  the specified file) then
  2706.                           your PATH environment  variable will be searched  for prog if it
  2707.                           isn't in the  current directory or  isn't fully qualified  (path
  2708.                           and extension) as though you had entered it on the command line.
  2709.                           If  viacc is FALSE then you must  specify the path and extension
  2710.                           of the program to run.   Additionally, the retcode variable will
  2711.                           only be meaningful if viacc is FALSE.
  2712.                        Examples
  2713.  
  2714.                         INTEGER rc
  2715.                         SHELL TRUE,rc,"DOOR",""
  2716.  
  2717.                         INTEGER rc
  2718.                         STRING p,c
  2719.                         LET p = "DOORWAY.EXE"
  2720.                         LET c = "com2 /v:d^O /m:600 /g:on /o: /k:v0 /x:
  2721.                         /c:dos"
  2722.                         SHELL FALSE,rc,p,c
  2723.  
  2724.                    See Also
  2725.  
  2726.  
  2727.  
  2728.  
  2729.  
  2730.  
  2731.  
  2732.                           
  2733.  
  2734.  
  2735.  
  2736.                   SHOWOFF   Statement
  2737.  
  2738.                    Function
  2739.                       Turn off showing information to the display.
  2740.  
  2741.                        Syntax
  2742.                       SHOWOFF
  2743.                                 No arguments are required
  2744.  
  2745.                        Remark
  2746.  
  2747.                       This statement  allows your PPL application to  turn off writing
  2748.                           information   to  the  local  and  remote  displays.    Used  in
  2749.                           conjunction  with  the  SHOWSTAT()  function  and  the  OPENCAP,
  2750.                           CLOSECAP,  and SHOWON  statements it  allows you  to temporarily
  2751.                           turn off the display while capturing output to the screen.  This
  2752.                           can be useful  anytime you want  to automate  a feature for  the
  2753.                           user  and  allow them  to  download  the resulting  capture file
  2754.                           instead of spending lots of time online.
  2755.                        Examples
  2756.  
  2757.                         BOOLEAN ss
  2758.                         LET ss = SHOWSTAT()
  2759.                         SHOWOFF
  2760.                         OPENCAP "CAP"+STRING(PCBNODE()),ocFlag
  2761.                         IF (ocFlag) THEN
  2762.                           DIR "U;NS"
  2763.                           CLOSECAP
  2764.                           KBDSTUFF "FLAG CAP"+STRING(PCBNODE())+CHR(13)
  2765.                         ENDIF
  2766.                         IF (ss) THEN
  2767.                           SHOWON
  2768.                         ELSE
  2769.                           SHOWOFF
  2770.                         ENDIF
  2771.  
  2772.                    See Also
  2773.                       CLOSECAP   Statement,  OPENCAP   Statement,  SHOWON   Statement,
  2774.                           SHOWSTAT() Function
  2775.  
  2776.  
  2777.  
  2778.  
  2779.  
  2780.  
  2781.  
  2782.                           
  2783.  
  2784.  
  2785.  
  2786.                   SHOWON   Statement
  2787.  
  2788.                    Function
  2789.                       Turn on showing information to the display.
  2790.  
  2791.                        Syntax
  2792.                       SHOWON
  2793.                                 No arguments are required
  2794.  
  2795.                        Remark
  2796.  
  2797.                       This statement allows  your PPL application  to turn on  writing
  2798.                           information   to  the  local  and  remote  displays.    Used  in
  2799.                           conjunction  with  the  SHOWSTAT()  function  and  the  OPENCAP,
  2800.                           CLOSECAP,  and SHOWOFF statements  it allows  you to temporarily
  2801.                           turn off the display while capturing output to the screen.  This
  2802.                           can be useful  anytime you want  to automate  a feature for  the
  2803.                           user  and  allow them  to  download  the resulting  capture file
  2804.                           instead of spending lots of time online.
  2805.                        Examples
  2806.  
  2807.                         BOOLEAN ss
  2808.                         LET ss = SHOWSTAT()
  2809.                         SHOWOFF
  2810.                         OPENCAP "CAP"+STRING(PCBNODE()),ocFlag
  2811.                         IF (ocFlag) THEN
  2812.                           DIR "U;NS"
  2813.                           CLOSECAP
  2814.                           KBDSTUFF "FLAG CAP"+STRING(PCBNODE())+CHR(13)
  2815.                         ENDIF
  2816.                         IF (ss) THEN
  2817.                           SHOWON
  2818.                         ELSE
  2819.                           SHOWOFF
  2820.                         ENDIF
  2821.  
  2822.                    See Also
  2823.                       CLOSECAP   Statement,  OPENCAP  Statement,   SHOWOFF  Statement,
  2824.                           SHOWSTAT() Function
  2825.  
  2826.  
  2827.  
  2828.  
  2829.  
  2830.  
  2831.  
  2832.                           
  2833.  
  2834.  
  2835.  
  2836.                   SHOWSTAT()   Function
  2837.  
  2838.                    Function
  2839.                       Determine if data is being shown on the display.
  2840.  
  2841.                        Syntax
  2842.                       SHOWSTAT()
  2843.                                 No arguments are required
  2844.  
  2845.                        Return Type and Value
  2846.  
  2847.                       BOOLEAN     Returns TRUE if data is being shown  on the display,
  2848.                           FALSE otherwise.
  2849.                        Remarks
  2850.  
  2851.                       This  function  allows your  PPL  application  to determine  the
  2852.                           status of writing information to  the local and remote displays.
  2853.                           Used in  conjunction  with the  OPENCAP, CLOSECAP,  SHOWON,  and
  2854.                           SHOWOFF statements  it allows  you to temporarily  turn off  the
  2855.                           display  while  capturing output  to  the screen.   This  can be
  2856.                           useful anytime you want  to automate a feature for the  user and
  2857.                           allow  them to download  the resulting  capture file  instead of
  2858.                           spending lots of time online.
  2859.                        Examples
  2860.  
  2861.                         BOOLEAN ss
  2862.                         LET ss = SHOWSTAT()
  2863.                         SHOWOFF
  2864.                         OPENCAP "CAP"+STRING(PCBNODE()),ocFlag
  2865.                         IF (ocFlag) THEN
  2866.                           DIR "U;NS"
  2867.                           CLOSECAP
  2868.                           KBDSTUFF "FLAG CAP"+STRING(PCBNODE())+CHR(13)
  2869.                         ENDIF
  2870.                         IF (ss) THEN
  2871.                           SHOWON
  2872.                         ELSE
  2873.                           SHOWOFF
  2874.                         ENDIF
  2875.  
  2876.                    See Also
  2877.                       CLOSECAP Statement, OPENCAP Statement, SHOWOFF Statement, SHOWON
  2878.                           Statement
  2879.  
  2880.  
  2881.  
  2882.  
  2883.  
  2884.  
  2885.  
  2886.                           
  2887.  
  2888.  
  2889.  
  2890.                   SLPATH()   Function
  2891.  
  2892.                    Function
  2893.                       Return the path of login security files as defined in PCBSetup.
  2894.  
  2895.                        Syntax
  2896.                       SLPATH()
  2897.                                 No arguments are required
  2898.  
  2899.                        Return Type & Value
  2900.  
  2901.                       STRING      Returns  the  path  of  the  PCBoard login  security
  2902.                           files.
  2903.                        Remarks
  2904.  
  2905.                       This function  will return the  path where login  security files
  2906.                           are located  as defined in PCBSetup.   It can be  used to create
  2907.                           and change them on the fly.
  2908.                        Examples
  2909.  
  2910.                         FAPPEND 1,SLPATH()+STRING(CURSEC),O_WR,S_DB
  2911.                         FPUTLN 1,U_NAME()
  2912.                         FCLOSE 1
  2913.  
  2914.                    See Also
  2915.  
  2916.  
  2917.  
  2918.  
  2919.  
  2920.  
  2921.  
  2922.                           
  2923.  
  2924.  
  2925.  
  2926.                   SOUND   Statement
  2927.  
  2928.                    Function
  2929.                       Turn  on  the speaker  on  the  local  computer  at  a  specific
  2930.                           frequency.
  2931.  
  2932.                        Syntax
  2933.                       SOUND freq
  2934.                                 freq An integer expression  with the frequency (in hertz)
  2935.                           at which to turn on the speaker or 0 to turn off the speaker.
  2936.  
  2937.                        Remarks
  2938.  
  2939.                       This  statement  can be  used  to generate  just about  any tone
  2940.                           desired on the speaker on the local PC.  It has no effect on the
  2941.                           remote computer and will only work with the built in speaker (in
  2942.                           other  words, it has no way of communicating with advanced sound
  2943.                           cards).   You  specify the  frequency of  the tone  you wish  to
  2944.                           generate in  hertz and  pass it to the  statement, or pass  0 to
  2945.                           turn off the speaker.
  2946.                        Examples
  2947.  
  2948.                         PAGEON
  2949.                         FOR i = 1 TO 10
  2950.                           MPRINT CHR(7)
  2951.                           SOUND 440
  2952.                           DELAY 9
  2953.                           SOUND 0
  2954.                           DELAY 9
  2955.                           IF (KINKEY() = " ") THEN
  2956.                             CHAT
  2957.                             GOTO exit
  2958.                           ENDIF
  2959.                         NEXT
  2960.                         :exit
  2961.  
  2962.                    See Also
  2963.  
  2964.  
  2965.  
  2966.  
  2967.  
  2968.  
  2969.  
  2970.                           
  2971.  
  2972.  
  2973.  
  2974.                   SPACE()   Function
  2975.  
  2976.                    Function
  2977.                       Create a string with a specified of spaces.
  2978.  
  2979.                        Syntax
  2980.                       SPACE(len)
  2981.                                 len  An integer expression with the number of  spaces for
  2982.                           the new string.
  2983.  
  2984.                        Return Type & Value
  2985.  
  2986.                       STRING      Returns a string of len spaces.
  2987.                        Remarks
  2988.  
  2989.                       This function is useful when formatting screen displays  without
  2990.                           ANSI and when  writing formatted information out to  a file.  It
  2991.                           will  create a string  of the length specified  with nothing but
  2992.                           spaces.   The returned string  may have  anywhere from 0  to 256
  2993.                           spaces.
  2994.                        Examples
  2995.  
  2996.                         PRINT
  2997.                         RANDOM(9),SPACE(5),RANDOM(9),SPACE(5),RANDOM(9)
  2998.  
  2999.                         FCREATE 1,"NEWFILE.DAT",O_WR,S_DB
  3000.                         FPUTLN 1,"NAME",SPACE(24),"CITY",SPACE(23),"PHONE"
  3001.                         FCLOSE 1
  3002.  
  3003.                    See Also
  3004.  
  3005.  
  3006.  
  3007.  
  3008.  
  3009.  
  3010.  
  3011.                           
  3012.  
  3013.  
  3014.  
  3015.                   SPRINT/SPRINTLN   Statements
  3016.  
  3017.                    Function
  3018.                       Print  (write) a line  to the local  screen (BBS)  only (with an
  3019.                           optional newline appended).
  3020.  
  3021.                        Syntax
  3022.                       S   P   R   I   N   Te   x   p   [   ,   e   x   p   ]
  3023.  
  3024.                       -                o                r                -
  3025.  
  3026.                       SPRINTLN [exp[,exp]]
  3027.                                 exp  An expression of any type  to evaluate and write  to
  3028.                           the caller's screen.
  3029.  
  3030.                        Remarks
  3031.  
  3032.                       These statements will evalutate zero, one or more expressions of
  3033.                           any  type and  write  the results  to  the BBS  for the  SysOp's
  3034.                           display.   The SPRINTLN  statement will append a  newline to the
  3035.                           end of the expressions; SPRINT will not.  Note that at least one
  3036.                           expression  must be  specified for  SPRINT, unlike  the SPRINTLN
  3037.                           statement which need not have any arguments passed to it.  These
  3038.                           statements only send information to the local display and do not
  3039.                           interpret  @ codes;  however, complete  ANSI  sequences will  be
  3040.                           interpreted.
  3041.                        Examples
  3042.  
  3043.                         SPRINT "The name of the currently running PPE file
  3044.                         is "
  3045.                         SPRINTLN PPENAME(),"."
  3046.                         SPRINT "The path where it is located is "
  3047.                         SPRINTLN PPEPATH(),"."
  3048.                         SPRINT "The date is ",DATE()," and the time is
  3049.                         ",TIME(),"."
  3050.                         SPRINTLN
  3051.  
  3052.                    See Also
  3053.                       MPRINT/MPRINTLN Statements, PRINT/PRINTLN Statements
  3054.  
  3055.  
  3056.  
  3057.  
  3058.  
  3059.  
  3060.  
  3061.                           
  3062.  
  3063.  
  3064.  
  3065.                   STACKED   Constant
  3066.  
  3067.                    Function
  3068.                       Set  the allow stacked commands flag in an INPUTSTR or PROMPTSTR
  3069.                           statement.
  3070.  
  3071.                        Value
  3072.                       16 = 10000b = 20o = 10h
  3073.  
  3074.                        Remarks
  3075.                       The  INPUTSTR and PROMPTSTR statements have the ability to allow
  3076.                           space and semi-colon  characters to be input  independent of the
  3077.                           valid  character string  specified.   This facilitates  entering
  3078.                           stacked  commands (commands  separated  by  space or  semi-colon
  3079.                           delimiters) by only requiring a single value be set in the input
  3080.                           statement instead of having to add " ;" to every valid character
  3081.                           mask.
  3082.  
  3083.                        Examples
  3084.  
  3085.                         STRING cmds
  3086.                         INPUTSTR
  3087.                         "Commands",cmds,@X0E,60,MASK_ASCII(),STACKED
  3088.                         TOKENIZE cmds
  3089.                         LET cmds = GETTOKEN()
  3090.                         IF (cmds = "QUIT") END
  3091.                         KBDSTUFF cmds+TOKENSTR()
  3092.  
  3093.                    See Also
  3094.                       INPUTSTR Statement, PROMPTSTR Statement
  3095.  
  3096.  
  3097.  
  3098.  
  3099.  
  3100.  
  3101.  
  3102.                           
  3103.  
  3104.  
  3105.  
  3106.                   STARTDISP   Statement
  3107.  
  3108.                    Function
  3109.                       Start PCBoard's display routines in a specified mode.
  3110.  
  3111.                        Syntax
  3112.                       STARTDISP mode
  3113.                                 mode An integer expression with the mode for display.
  3114.  
  3115.                        Remarks
  3116.  
  3117.                       PCBoard  has two modes for displaying information:  non stop and
  3118.                           line  count.  Non stop mode (initiated by passing FNS, for Force
  3119.                           Non  Stop, as the  mode parameter)  displays information without
  3120.                           regard to how fast the display is or whether or not the user can
  3121.                           read  it all.   Line count  mode (initiated by  passing FCL, for
  3122.                           Force Count Lines, as  the mode parameter) displays  information
  3123.                           while  counting lines and pausing  after every screenful to wait
  3124.                           for user  input.  Finally,  NC may be specified  to reinitialize
  3125.                           the internal display counters without changing the current mode.
  3126.                        Examples
  3127.  
  3128.                         STARTDISP FCL
  3129.                         FOR i = 1 TO 100
  3130.                           PRINTLN "Line ",i
  3131.                         NEXT
  3132.                         STARTDISP FNS
  3133.                         FOR i = 1 TO 100
  3134.                           PRINTLN "Line ",i
  3135.                         NEXT
  3136.                         STARTDISP NC
  3137.                         FOR i = 1 TO 100
  3138.                           PRINTLN "Line ",i
  3139.                         NEXT
  3140.  
  3141.                    See Also
  3142.                       ABORT() Function, RESETDISP Statement
  3143.  
  3144.  
  3145.  
  3146.  
  3147.  
  3148.  
  3149.  
  3150.                           
  3151.  
  3152.  
  3153.  
  3154.                   STOP   Statement
  3155.  
  3156.                    Function
  3157.                       Abort PPE execution.
  3158.  
  3159.                        Syntax
  3160.                       STOP
  3161.                                 No arguments are required
  3162.  
  3163.                        Remarks
  3164.  
  3165.                       This statement may be used to abnormally terminate PPE execution
  3166.                           at any point.   The only real difference between  this statement
  3167.                           and END is whether  or not information  written to channel 0  is
  3168.                           saved when the .  END will save the output to  the script answer
  3169.                           file; STOP will not.
  3170.                        Examples
  3171.  
  3172.                         STRING Question, Answer
  3173.                         LET Question = "What is your street address ..."
  3174.                         GOSUB ask
  3175.                         INPUTYN "Save address",Answer,@X0E
  3176.                         IF (Answer = NOCHAR()) STOP
  3177.                         END
  3178.  
  3179.                         :ask ' Sub to ask a question, get an answer, and
  3180.                         log them to a file
  3181.                         LET Answer = ""
  3182.                         PRINTLN "@X0E",Question
  3183.                         INPUT "",Answer
  3184.                         NEWLINES 2
  3185.                         FPUTLN 0,"Q: ",STRIPATX(Question)
  3186.                         FPUTLN 0,"A: ",Answer
  3187.                         RETURN
  3188.  
  3189.                    See Also
  3190.                       END Statement, RETURN Statement
  3191.  
  3192.  
  3193.  
  3194.  
  3195.  
  3196.  
  3197.  
  3198.                           
  3199.  
  3200.  
  3201.  
  3202.                   STRING   Type
  3203.  
  3204.                    Function
  3205.                       Declare one or more variables of type string.
  3206.  
  3207.                        Syntax
  3208.                       STRING var|arr(s[,s[,s]])[,var|arr(s[,s[,s]])]
  3209.                                 var  The name of a variable to  declare.  Must start with
  3210.                           a letter [A-Z] which may be followed by letters, digits [0-9] or
  3211.                           the underscore  [_].  May be of any length but only the first 32
  3212.                           characters are used.
  3213.  
  3214.                                 arr  The name of an array variable to  declare.  The same
  3215.                           naming conventions as var are used.
  3216.                                 s    The size  (0-based) of an  array variable dimension.
  3217.                           Any constant integer expression is allowed.
  3218.  
  3219.                        Remarks
  3220.                       STRING  variables are  stored as  pointers arrays  of characters
  3221.                           from 0 to 257 bytes in size.  If the array has 0 or 1 characters
  3222.                           in it, it is a 0 length string.  Arrays with 2 to 257 characters
  3223.                           have a  length  of the  array  size  minus one.    Valid  string
  3224.                           characters  are ASCII 1 through ASCII 255.   ASCII 0 is reserved
  3225.                           for terminating the  string and may not appear in  the middle of
  3226.                           the string.   A STRING assignment to an INTEGER will convert the
  3227.                           string to the four byte binary integer value (similar to BASIC's
  3228.                           VAL  function and  C's  atol function).    An INTEGER  to STRING
  3229.                           assignment will result  in a string  with the representation  of
  3230.                           the  number  (similar to  BASIC's  STR$  function  and C's  ltoa
  3231.                           function).  If a STRING  is assigned to or from any  other type,
  3232.                           an appropriate conversion is performed automatically by PPL.
  3233.  
  3234.                        Examples
  3235.  
  3236.                         STRING char, str, tmp, labels(10), names(20,3)
  3237.  
  3238.                    See Also
  3239.                       BOOLEAN Type, DATE Type, INTEGER Type, MONEY Type, TIME Type
  3240.  
  3241.  
  3242.  
  3243.  
  3244.  
  3245.  
  3246.  
  3247.                           
  3248.  
  3249.  
  3250.  
  3251.                   STRING()   Function
  3252.  
  3253.                    Function
  3254.                       Convert any expression to a string.
  3255.  
  3256.                        Syntax
  3257.                       STRING(exp)
  3258.                                 exp  Any expression.
  3259.  
  3260.                        Return Type & Value
  3261.  
  3262.                       STRING      Returns exp formatted as a string.
  3263.                        Remarks
  3264.  
  3265.                       This function  is immensely useful  anytime you need  to convert
  3266.                           any  expression to  string format.   For  example, to  append an
  3267.                           integer value to the end  of a string without this function, you
  3268.                           would need to assign the integer to a string and then append the
  3269.                           temporary string to actual string.  This is because PPL's normal
  3270.                           course of  action when  performing arithmetic  with incompatible
  3271.                           types  is to  convert everything  to integer  first.   With this
  3272.                           function,  you can accomplish  the same function in  one line of
  3273.                           code  with one  expression because you  are forcing  addition of
  3274.                           compatible types (strings).   Note that  PPL does  automatically
  3275.                           convert  incompatible  types  whenever  possible,   making  this
  3276.                           function unnecessary in many  cases.  This function  should only
  3277.                           be  necessary when trying to append the text representation of a
  3278.                           non-string type to a string via the + operator.
  3279.                        Examples
  3280.  
  3281.                         INTEGER i
  3282.                         STRING  s(5)
  3283.                         FOR i = 1 to 5
  3284.                           LET s(i) = "This is string "+STRING(i)
  3285.                         NEXT
  3286.  
  3287.                         STRING s
  3288.                         LET s = STRING(ABORT())+" "+STRING(DATE())+"
  3289.                         "+STRING(10)+" "
  3290.                         LET s = s+STRING($10.00)+" "+STRING(TIME())
  3291.                         PRINTLN s ' will print "0 10-31-67 10 $10.00
  3292.                         03:27:00" (or similar)
  3293.  
  3294.                    See Also
  3295.  
  3296.  
  3297.  
  3298.  
  3299.  
  3300.  
  3301.  
  3302.                           
  3303.  
  3304.  
  3305.  
  3306.                   STRIP()   Function
  3307.  
  3308.                    Function
  3309.                       Remove all occurrences of a character from a string.
  3310.  
  3311.                        Syntax
  3312.                       STRIP(str,ch)
  3313.                                 str  Any string expression.
  3314.  
  3315.                                 ch   String with character to remove from str.
  3316.  
  3317.                        Return Type & Value
  3318.                       STRING      Returns sexp without occurrences of ch that may have
  3319.                           been present previously.
  3320.  
  3321.                        Remarks
  3322.                       This function  is  used to  strip  a selected  character from  a
  3323.                           string.    This can  be  useful when  you need  to  remove known
  3324.                           formatting characters from a string, such as slashes and hyphens
  3325.                           from a date string.
  3326.  
  3327.                        Examples
  3328.                         STRING s
  3329.                         WHILE (LEN(s) < 6) DO
  3330.                           INPUTSTR "Enter date (MM-DD-
  3331.                         YY)",s,@X0E,8,"0123456789-",DEFS
  3332.                           LET s = STRIP(s,"-")
  3333.                         ENDWHILE
  3334.                         PRINTLN "Date (MMDDYY):  ",s
  3335.  
  3336.                    See Also
  3337.  
  3338.  
  3339.  
  3340.  
  3341.  
  3342.  
  3343.  
  3344.                           
  3345.  
  3346.  
  3347.  
  3348.                   STRIPATX()   Function
  3349.  
  3350.                    Function
  3351.                       Remove @X codes from a string.
  3352.  
  3353.                        Syntax
  3354.                       STRIPATX(sexp)
  3355.                                 sexp Any string expression.
  3356.  
  3357.                        Return Type & Value
  3358.  
  3359.                       STRING      Returns sexp without any @X codes that may have been
  3360.                           present previously.
  3361.                        Remarks
  3362.  
  3363.                       This  function is used  to strip PCBoard  @X color codes  from a
  3364.                           string or  string expression.  This  is useful when  you want to
  3365.                           log information  to a  file without  the @X  codes  used in  the
  3366.                           screen display.
  3367.                        Examples
  3368.  
  3369.                         STRING Question, Answer
  3370.                         LET Question = "What is your street address ..."
  3371.                         GOSUB ask
  3372.                         END
  3373.                         :ask ' Sub to ask a question, get an answer, and
  3374.                         log them to a file
  3375.                         LET Answer = ""
  3376.                         PRINTLN "@X0E",Question
  3377.                         INPUT "",Answer
  3378.                         NEWLINES 2
  3379.                         FPUTLN 0,"Q: ",STRIPATX(Question)
  3380.                         FPUTLN 0,"A: ",Answer
  3381.                         RETURN
  3382.  
  3383.                    See Also
  3384.  
  3385.  
  3386.  
  3387.  
  3388.  
  3389.  
  3390.  
  3391.                           
  3392.  
  3393.  
  3394.  
  3395.                   SYSOPSEC()   Function
  3396.  
  3397.                    Function
  3398.                       Get the security level as the SysOp security level.
  3399.  
  3400.                        Syntax
  3401.                       SYSOPSEC()
  3402.                                 No arguments are required
  3403.  
  3404.                        Return Type & Value
  3405.  
  3406.                       INTEGER     Returns  the  SysOp  security  level  as defined  in
  3407.                           PCBSetup.
  3408.                        Remarks
  3409.  
  3410.                       This function  is useful for  those occasions when  you need  to
  3411.                           limit functionality in your  PPL applications to users  having a
  3412.                           security  level greater  than  or  equal to  the  defined  SysOp
  3413.                           security level in PCBSetup.
  3414.                        Examples
  3415.  
  3416.                         INTEGER min
  3417.                         IF (CURSEC() >= SYSOPSEC()) THEN
  3418.                           LET min = 60
  3419.                         ELSE
  3420.                           LET min = 5
  3421.                         ENDIF
  3422.                         ADJTIME min
  3423.                         PRINTLN "Your time available has been increased by
  3424.                         ",min," minutes"
  3425.  
  3426.                    See Also
  3427.  
  3428.  
  3429.  
  3430.  
  3431.  
  3432.  
  3433.  
  3434.                           
  3435.  
  3436.  
  3437.  
  3438.                   S_DB   Constant
  3439.  
  3440.                    Function
  3441.                       Set  the   share  deny  both   (read  and  write)   flag  in   a
  3442.                           FCREATE/FOPEN/FAPPEND statement.
  3443.  
  3444.                        Value
  3445.                       3 = 11b = 3o = 3h
  3446.  
  3447.                        Remarks
  3448.                       DOS 3.1 or later  (which is what is required  by PCBoard) allows
  3449.                           processes to decide what mode of file sharing should be allowed.
  3450.                           This constant allows you to specify that other processes may not
  3451.                           open the same file for either read or write access from the time
  3452.                           you open  the file  to the time  you close  the file.   This  is
  3453.                           useful when you  need exclusive access to a  file for any reason
  3454.                           and need to restrict other processes access to the same file.
  3455.  
  3456.                        Examples
  3457.  
  3458.                         FOPEN 1,"FILE.DAT",O_RD,S_DB ' Deny other processes
  3459.                         all access
  3460.                         FOR i = 1 TO 10
  3461.                           FGET 1,s
  3462.                           PRINTLN s
  3463.                         NEXT
  3464.                         FCLOSE 1 ' Close the file and allow others to open
  3465.                         it in any mode
  3466.  
  3467.                    See Also
  3468.                       S_DN Constant, S_DR Constant, S_DW Constant
  3469.  
  3470.  
  3471.  
  3472.  
  3473.  
  3474.  
  3475.  
  3476.                           
  3477.  
  3478.  
  3479.  
  3480.                   S_DN   Constant
  3481.  
  3482.                    Function
  3483.                       Set  the  share  deny  none  flag  in  a   FCREATE/FOPEN/FAPPEND
  3484.                           statement.
  3485.  
  3486.                        Value
  3487.                       0 = 0b = 0o = 0h
  3488.  
  3489.                        Remarks
  3490.                       DOS 3.1 or later  (which is what is required  by PCBoard) allows
  3491.                           processes to decide what mode of file sharing should be allowed.
  3492.                           This constant allows  you to  specify that  other processes  may
  3493.                           open the  same file for read  or write access from  the time you
  3494.                           open the file  to the time you close  the file.  This  is useful
  3495.                           when you  don't need exclusive access  to a file  for any reason
  3496.                           and need not restrict other processes.
  3497.  
  3498.                        Examples
  3499.  
  3500.                         FOPEN 1,"FILE.DAT",O_RD,S_DN ' Do not deny other
  3501.                         processes any access
  3502.                         FOR i = 1 TO 10
  3503.                           FGET 1,s
  3504.                           PRINTLN s
  3505.                         NEXT
  3506.                         FCLOSE 1 ' Close the file and allow others to open
  3507.                         it in any mode
  3508.  
  3509.                    See Also
  3510.                       S_DB Constant, S_DR Constant, S_DW Constant
  3511.  
  3512.  
  3513.  
  3514.  
  3515.  
  3516.  
  3517.  
  3518.                           
  3519.  
  3520.  
  3521.  
  3522.                   S_DR   Constant
  3523.  
  3524.                    Function
  3525.                       Set  the  share  deny  read  flag  in  a   FCREATE/FOPEN/FAPPEND
  3526.                           statement.
  3527.  
  3528.                        Value
  3529.                       1 = 1b = 1o = 1h
  3530.  
  3531.                        Remarks
  3532.                       DOS 3.1 or later  (which is what is required  by PCBoard) allows
  3533.                           processes to decide what mode of file sharing should be allowed.
  3534.                           This constant allows  you to  specify that  other processes  may
  3535.                           open  the same  file, but  that they  may not  open it  for read
  3536.                           access, from  the time you open  the file to the  time you close
  3537.                           the file.
  3538.  
  3539.                        Examples
  3540.  
  3541.                         FOPEN 1,"FILE.DAT",O_RD,S_DR ' Deny other processes
  3542.                         read access
  3543.                         FOR i = 1 TO 10
  3544.                           FGET 1,s
  3545.                           PRINTLN s
  3546.                         NEXT
  3547.                         FCLOSE 1 ' Close the file and allow others to open
  3548.                         it in any mode
  3549.  
  3550.                    See Also
  3551.                       S_DB Constant, S_DN Constant, S_DW Constant
  3552.  
  3553.  
  3554.  
  3555.  
  3556.  
  3557.  
  3558.  
  3559.                           
  3560.  
  3561.  
  3562.  
  3563.                   S_DW   Constant
  3564.  
  3565.                    Function
  3566.                       Set  the  share  deny  write  flag  in  a  FCREATE/FOPEN/FAPPEND
  3567.                           statement.
  3568.  
  3569.                        Value
  3570.                       2 = 10b = 2o = 2h
  3571.  
  3572.                        Remarks
  3573.                       DOS 3.1 or later  (which is what is required  by PCBoard) allows
  3574.                           processes to decide what mode of file sharing should be allowed.
  3575.                           This constant allows  you to  specify that  other processes  may
  3576.                           open the  same file,  but that  they may not  open it  for write
  3577.                           access, from  the time you open  the file to the  time you close
  3578.                           the file.  This is useful when you want to ensure that data will
  3579.                           not change while you are reading it.
  3580.  
  3581.                        Examples
  3582.  
  3583.                         FOPEN 1,"FILE.DAT",O_RD,S_DW ' Deny other processes
  3584.                         write access
  3585.                         FOR i = 1 TO 10
  3586.                           FGET 1,s
  3587.                           PRINTLN s
  3588.                         NEXT
  3589.                         FCLOSE 1 ' Close the file and allow others to open
  3590.                         it in any mode
  3591.  
  3592.                    See Also
  3593.                       S_DB Constant, S_DN Constant, S_DR Constant
  3594.  
  3595.  
  3596.  
  3597.  
  3598.  
  3599.  
  3600.  
  3601.                           
  3602.  
  3603.  
  3604.  
  3605.                   TEMPPATH()   Function
  3606.  
  3607.                    Function
  3608.                       Return  the path to  the temporary work directory  as defined in
  3609.                           PCBSetup.
  3610.  
  3611.                        Syntax
  3612.                       TEMPPATH()
  3613.                                 No arguments are required
  3614.  
  3615.                        Return Type & Value
  3616.  
  3617.                       STRING      Returns  the path of  the node temporary  work files
  3618.                           area.
  3619.                        Remarks
  3620.  
  3621.                       This function will  return the path  where temporary work  files
  3622.                           should be created  as defined in PCBSetup.  This  path is a good
  3623.                           place  for  small   temporary  files  that  need  not   be  kept
  3624.                           permanently since  it often points to a RAM  drive or other fast
  3625.                           local storage.
  3626.                        Examples
  3627.  
  3628.                         INTEGER rc
  3629.                         SHELL TRUE,rc,"DIR",">"+TEMPPATH()+"TMPDIR"
  3630.                         DISPFILE TEMPPATH()+"TMPDIR",DEFS
  3631.                         DELETE TEMPPATH()+"TMPDIR"
  3632.  
  3633.                    See Also
  3634.  
  3635.  
  3636.  
  3637.  
  3638.  
  3639.  
  3640.  
  3641.                           
  3642.  
  3643.  
  3644.  
  3645.                   TIME   Type
  3646.  
  3647.                    Function
  3648.                       Declare one or more variables of type time.
  3649.  
  3650.                        Syntax
  3651.                       TIME var|arr(s[,s[,s]])[,var|arr(s[,s[,s]])]
  3652.                            var  The name of a variable to  declare.  Must start with
  3653.                           a letter [A-Z] which may be followed by letters, digits [0-9] or
  3654.                           the underscore  [_].  May be of any length but only the first 32
  3655.                           characters are used.
  3656.  
  3657.                                 arr  The name of an array variable to  declare.  The same
  3658.                           naming conventions as var are used.
  3659.                                 s    The size  (0-based) of an  array variable dimension.
  3660.                           Any constant integer expression is allowed.
  3661.  
  3662.                        Remarks
  3663.                       TIME  variables are  stored as  seconds elapsed  since midnight.
  3664.                           Valid  times are 0 (00:00:00) through   86399 (23:59:59).  It is
  3665.                           stored internally  as a four byte  unsigned long integer.   If a
  3666.                           TIME  is assigned to  or from  an INTEGER type  then the seconds
  3667.                           since midnight (0-86399) is assigned.  If a TIME  is assigned to
  3668.                           a  STRING  type  then  it  is  automatically  converted  to  the
  3669.                           following format:   "HH:MM:SS", where HH  is the two digit  hour
  3670.                           (00-23), MM is  the two digit minute (00-59), and  SS is the two
  3671.                           digit second (00-59).  If a foreign language is in use that uses
  3672.                           a different time format (for example, "HH.MM.SS") then that will
  3673.                           be taken into  account.  If a STRING is assigned  to a TIME then
  3674.                           PPL  will  do  it's  best  to convert  the  string  back  to the
  3675.                           appropriate  time.  All other types,  when assigned to or from a
  3676.                           TIME,  will  be converted  to  an  INTEGER  first  before  being
  3677.                           assigned to or from the TIME type.
  3678.  
  3679.                        Examples
  3680.  
  3681.                         TIME tob, now, pageHours(2), hourList(24)
  3682.  
  3683.                    See Also
  3684.                       BOOLEAN Type, DATE Type, INTEGER Type, MONEY Type, STRING Type
  3685.  
  3686.  
  3687.  
  3688.  
  3689.  
  3690.  
  3691.  
  3692.                           
  3693.  
  3694.  
  3695.  
  3696.                   TIME()   Function
  3697.  
  3698.                    Function
  3699.                       Get the current time.
  3700.  
  3701.                        Syntax
  3702.                       TIME()
  3703.                                 No arguments are required
  3704.  
  3705.                        Return Type & Value
  3706.  
  3707.                       TIME  Returns the current time.
  3708.                        Remarks
  3709.  
  3710.                       The  time returned  is represented  internally as the  number of
  3711.                           seconds elapsed  since midnight.    It may  be used  as is  (for
  3712.                           display,  storage  or  as an  argument  to  another  function or
  3713.                           statement) or assigned  to an integer  for arithmetic  purposes.
  3714.                           00:00:00 (midnight)  has a value  of 0,  00:00:01 a value  of 1,
  3715.                           00:01:00  a value of  60, 01:00:00 a  value of  3600, etc, until
  3716.                           23:59:59 which has a value of 86399.
  3717.                        Examples
  3718.  
  3719.                         PRINTLN "The time is ",TIME()
  3720.  
  3721.                    See Also
  3722.  
  3723.  
  3724.  
  3725.  
  3726.  
  3727.  
  3728.  
  3729.                           
  3730.  
  3731.  
  3732.  
  3733.                   TIMEAP()   Function
  3734.  
  3735.                    Function
  3736.                       Converts a time value to a 12-hour AM/PM formatted string.
  3737.  
  3738.                        Syntax
  3739.                       TIMEAP(texp)
  3740.                                 texp Any time expression.
  3741.  
  3742.                        Return Type & Value
  3743.  
  3744.                       STRING      Returns a string  formatted with the  time specified
  3745.                           by texp in a 12-hour AM/PM format.
  3746.                        Remarks
  3747.  
  3748.                       TIME  values  are,  by  default,  formatted  for  military  time
  3749.                           ("HH:MM:SS") when displayed  or assigned to  a string  variable.
  3750.                           You may  wish to format them  in a 12-hour AM/PM  format in some
  3751.                           circumstances,  however.  This  function perform  the conversion
  3752.                           and format  the time in "HH:MM:SS  XM" format (HH  = hour, MM  =
  3753.                           minute, SS = second, X = A or P).
  3754.                        Examples
  3755.  
  3756.                         PRINTLN "The current time is ",TIMEAP(TIME())
  3757.  
  3758.                    See Also
  3759.  
  3760.  
  3761.  
  3762.  
  3763.  
  3764.  
  3765.  
  3766.                           
  3767.  
  3768.  
  3769.  
  3770.                   TOKCOUNT()   Function
  3771.  
  3772.                    Function
  3773.                       Access the number of tokens pending.
  3774.  
  3775.                        Syntax
  3776.                       TOKCOUNT()
  3777.                                 No arguments are required
  3778.  
  3779.                        Return Type & Value
  3780.  
  3781.                       INTEGER     Returns the number of tokens available.
  3782.                        Remarks
  3783.  
  3784.                       Parameter  passing between  PCBoard  and  PPL applications  (and
  3785.                           between  PPL   applications)   and  command   line  parsing   is
  3786.                           accomplished via tokens.   This function will return  the number
  3787.                           of  tokens   available  via  the  GETTOKEN   statement  and  the
  3788.                           GETTOKEN()  function.   The  value  returned  by  this  will  be
  3789.                           decremented after each token is retrieved until it reaches 0 (no
  3790.                           more tokens available).   The TOKENIZE  function will  overwrite
  3791.                           any  pending  tokens  with  new  tokens  and  reinitialize  this
  3792.                           function to the  new number.   Finally, the TOKENSTR()  function
  3793.                           will clear this function to  0 and return all tokens in a string
  3794.                           with semi-colons separating individual tokens.
  3795.                        Examples
  3796.  
  3797.                         PRINTLN "There are ",TOKCOUNT()," tokens"
  3798.                         WHILE (TOKCOUNT() > 0) PRINTLN GETTOKEN()
  3799.  
  3800.                    See Also
  3801.  
  3802.  
  3803.  
  3804.  
  3805.  
  3806.  
  3807.  
  3808.                           
  3809.  
  3810.  
  3811.  
  3812.                   TOKENIZE   Statement
  3813.  
  3814.                    Function
  3815.                       Split  up  a  string into  tokens  separated  by semi-colons  or
  3816.                           spaces.
  3817.  
  3818.                        Syntax
  3819.                       TOKENIZE sexp
  3820.                                 sexp Any string expression.
  3821.  
  3822.                        Remarks
  3823.  
  3824.                       One of the strongest features of PCBoard is it's ability to take
  3825.                           a series of  stacked parameters from a command line and use them
  3826.                           all at once  instead of requiring the user  to navigate a series
  3827.                           of menus  and select one  option at each  step of the way.   The
  3828.                           TOKENIZE statement is the PPL equivalent of what PCBoard uses to
  3829.                           break a  command line  into individual  commands (tokens).   The
  3830.                           number of  tokens available may  be accessed via  the TOKCOUNT()
  3831.                           function, and each token may be accessed,  one at a time, by the
  3832.                           GETTOKEN statement and/or the GETTOKEN() function.
  3833.                        Examples
  3834.  
  3835.                         STRING  cmdline
  3836.                         INPUT "Command",cmdline
  3837.                         TOKENIZE cmdline
  3838.                         PRINTLN "You entered ",TOKCOUNT()," tokens"
  3839.                         WHILE (TOKCOUNT() > 0) PRINTLN "Token: 
  3840.                         ",CHR(34),GETTOKEN(),CHR(34)
  3841.  
  3842.                    See Also
  3843.                       GETTOKEN  Statement, GETTOKEN()  Function, TOKCOUNT()  Function,
  3844.                           TOKENSTR() Function
  3845.  
  3846.  
  3847.  
  3848.  
  3849.  
  3850.  
  3851.  
  3852.                           
  3853.  
  3854.  
  3855.  
  3856.                   TOKENSTR()   Function
  3857.  
  3858.                    Function
  3859.                       Rebuild and return a previously tokenized string.
  3860.  
  3861.                        Syntax
  3862.                       TOKENSTR()
  3863.                                 No arguments are required
  3864.  
  3865.                        Return Type & Value
  3866.  
  3867.                       STRING      Returns  the  rebuilt  string  that  was  previously
  3868.                           tokenized.
  3869.                        Remarks
  3870.  
  3871.                       One of the strongest features of PCBoard is it's ability to take
  3872.                           a series of stacked parameters  from a command line and use them
  3873.                           all at once instead  of requiring the user to  navigate a series
  3874.                           of menus  and select one  option at each  step of the way.   The
  3875.                           TOKENIZE statement is the PPL equivalent of what PCBoard uses to
  3876.                           break a  command line into  individual commands (tokens).   This
  3877.                           function  will take all  pending tokens and build  a string with
  3878.                           appropriate token separators.   For example, the string "R  A S"
  3879.                           would  be broken into  three separate tokens; "R",  "A" and "S".
  3880.                           TOKENSTR() would  take  those tokens  and return  the  following
  3881.                           string:  "R;A;S".   Note that, regardless of the  separator used
  3882.                           in the original string, the semi-colon character will be used in
  3883.                           the rebuilt string.
  3884.                        Examples
  3885.  
  3886.                         STRING  cmdline
  3887.                         INPUT "Command",cmdline
  3888.                         TOKENIZE cmdline
  3889.                         PRINTLN "You entered ",TOKCOUNT()," tokens"
  3890.                         PRINTLN "Original string:  ",cmdline
  3891.                         PRINTLN "     TOKENSTR():  ",TOKENSTR()
  3892.  
  3893.                    See Also
  3894.                       GETTOKEN  Statement, GETTOKEN()  Function, TOKCOUNT()  Function,
  3895.                           TOKENIZE Statement
  3896.  
  3897.  
  3898.  
  3899.  
  3900.  
  3901.  
  3902.  
  3903.                           
  3904.  
  3905.  
  3906.  
  3907.                   TRIM()   Function
  3908.  
  3909.                    Function
  3910.                       Trim a specified character from both ends of a string.
  3911.  
  3912.                        Syntax
  3913.                       TRIM(str,ch)
  3914.                                 str  Any string expression.
  3915.  
  3916.                                 ch   A string with the character to  strip from both ends
  3917.                           of str.
  3918.  
  3919.                        Return Type & Value
  3920.                       STRING      Returns the trimmed str.
  3921.  
  3922.                        Remarks
  3923.                       A common need in programming is to strip leading and/or trailing
  3924.                           spaces (or  other  characters).   This  function  will  strip  a
  3925.                           specified character  from both ends  of a string and  return the
  3926.                           trimmed string.
  3927.  
  3928.                        Examples
  3929.                         STRING s
  3930.                         LET s = "   TEST   "
  3931.                         PRINTLN TRIM(s," ") ' Will print "TEST"
  3932.                         PRINTLN TRIM(".....DA"+"TA.....",".") ' Will print
  3933.                         "DATA"
  3934.                         PRINTLN TRIM(".....DA"+"TA....."," ") ' Will print
  3935.                         ".....DATA....."
  3936.  
  3937.                    See Also
  3938.  
  3939.                       LTRIM() Function, RTRIM() Function
  3940.  
  3941.  
  3942.  
  3943.  
  3944.  
  3945.  
  3946.  
  3947.                           
  3948.  
  3949.  
  3950.  
  3951.                   TRUE   Constant
  3952.  
  3953.                    Function
  3954.                       To  provide a  named  constant for  the  boolean true  value  in
  3955.                           boolean expressions.
  3956.  
  3957.                        Value
  3958.                       1 = 1b = 1o = 1h
  3959.  
  3960.                        Remarks
  3961.                       BOOLEAN logic is  based on two values:  TRUE  (1) and FALSE (0).
  3962.                           The  literal  numeric   constants  0  and  1  may  be   used  in
  3963.                           expressions, or you may use  the predefined named constants TRUE
  3964.                           and FALSE.   They make for more readable, maintainable  code and
  3965.                           have no more overhead than any other constant value at run time.
  3966.  
  3967.                        Examples
  3968.  
  3969.                         BOOLEAN flag
  3970.                         LET flag = TRUE
  3971.                         WHILE (!flag) DO
  3972.                           INPUTSTR
  3973.                         "Text",s,@X0E,60,"ABCDEFGHIJKLMNOPQRSTUVWXYZ
  3974.                         ",UPCASE
  3975.                           PRINTLN s
  3976.                           IF (s = "QUIT") LET flag = FALSE
  3977.                         ENDWHILE
  3978.  
  3979.                    See Also
  3980.                       FALSE Constant
  3981.  
  3982.  
  3983.  
  3984.  
  3985.  
  3986.  
  3987.  
  3988.                           
  3989.  
  3990.  
  3991.  
  3992.                   UN_...()   Function
  3993.  
  3994.                    Function
  3995.                       Get a piece of information about a node.
  3996.  
  3997.                        Syntax
  3998.                       UN_...()
  3999.                                 No arguments are required
  4000.  
  4001.                           UN_ should  be followed  by one of  the following:   CITY, NAME,
  4002.                           OPER, or STAT.
  4003.                        Return Type & Value
  4004.  
  4005.                       STRING      Returns   a  string  with   the  desired   piece  of
  4006.                           information.
  4007.                        Remarks
  4008.  
  4009.                       There  are  actually   four  different  functions  that   return
  4010.                           information from the  USERNET.XXX file.   UN_CITY() will  return
  4011.                           the  city  field, UN_NAME()  will  return  the user  name field,
  4012.                           UN_OPER() will return  the operation text  field, and  UN_STAT()
  4013.                           will return the status field.  The information returned by these
  4014.                           functions  is   only  meaningful  after  executing   the  RDUNET
  4015.                           statement for a specific node.
  4016.                        Examples
  4017.  
  4018.                         RDUNET PCBNODE()
  4019.                         WRUNET
  4020.                         PCBNODE(),UN_STAT(),UN_NAME(),UN_CITY(),"Running
  4021.                         "+PPENAME(),""
  4022.                         RDUNET 1
  4023.                         WRUNET
  4024.                         1,UN_STAT(),UN_NAME(),UN_CITY(),UN_OPER(),"Hello
  4025.                         there node 1"
  4026.  
  4027.                    See Also
  4028.                       RDUNET Statement, WRUNET Statement
  4029.  
  4030.  
  4031.  
  4032.  
  4033.  
  4034.  
  4035.  
  4036.                           
  4037.  
  4038.  
  4039.  
  4040.                   UPCASE   Constant
  4041.  
  4042.                    Function
  4043.                       Set  the force  uppercase  flag  in  an  INPUTSTR  or  PROMPTSTR
  4044.                           statement.
  4045.  
  4046.                        Value
  4047.                       8 = 1000b = 10o = 8h
  4048.  
  4049.                        Remarks
  4050.                       The  INPUTSTR and PROMPTSTR statements have the ability to force
  4051.                           all  input characters to  uppercase.  This is  useful in getting
  4052.                           case insensitive  replies from the user.  If  this flag is used,
  4053.                           you need  not pass lowercase  valid characters as  they will  be
  4054.                           automatically  converted at runtime.   If this flag  is not used
  4055.                           and you  need to  input alphabetic  characters, you should  pass
  4056.                           both lowercase  and uppercase characters in  the valid character
  4057.                           string.
  4058.  
  4059.                        Examples
  4060.  
  4061.                         STRING s
  4062.                         WHILE (s <> "QUIT") DO
  4063.                           INPUTSTR
  4064.                         "Text",s,@X0E,60,"ABCDEFGHIJKLMNOPQRSTUVWXYZ
  4065.                         ",UPCASE
  4066.                           PRINTLN s
  4067.                         ENDWHILE
  4068.  
  4069.                    See Also
  4070.                       INPUTSTR Statement, PROMPTSTR Statement
  4071.  
  4072.  
  4073.  
  4074.  
  4075.  
  4076.  
  4077.  
  4078.                           
  4079.  
  4080.  
  4081.  
  4082.                   UPPER()   Function
  4083.  
  4084.                    Function
  4085.                       Converts lowercase characters in a string to uppercase.
  4086.  
  4087.                        Syntax
  4088.                       UPPER(sexp)
  4089.                                 sexp Any string expression.
  4090.  
  4091.                        Return Type & Value
  4092.  
  4093.                       STRING      Returns sexp with all lowercase characters converted
  4094.                           to uppercase.
  4095.                        Remarks
  4096.  
  4097.                       Although  "STRING" is  technically different from  "string" (ie,
  4098.                           the computer doesn't  recognize them as  being the same  because
  4099.                           one  is uppercase  and  the other  is  lowercase), it  is  often
  4100.                           necessary  to save,  display  or compare  information in  a case
  4101.                           insensitive format.  This function will return a string with all
  4102.                           lowercase characters  converted  to uppercase.   So,  using  the
  4103.                           above example, UPPER("string") would return "STRING".
  4104.                        Examples
  4105.  
  4106.                         STRING s
  4107.                         WHILE (UPPER(s) <> "QUIT") DO
  4108.                           INPUT "Text",s
  4109.                           PRINTLN LOWER(s)
  4110.                         ENDWHILE
  4111.  
  4112.                    See Also
  4113.                       LOWER() Function
  4114.  
  4115.  
  4116.  
  4117.  
  4118.  
  4119.  
  4120.  
  4121.                           
  4122.  
  4123.  
  4124.  
  4125.                   U_ADDR()   VARIABLE ARRAY
  4126.  
  4127.                    Function
  4128.                       Allow  reading   and  writing  of  the   current  users  address
  4129.                           information.
  4130.  
  4131.                        Type & Value
  4132.                       STRING
  4133.                                 Subscript 0 Address Line 1 (50 characters max).
  4134.  
  4135.                                 Subscript 1 Address Line 2 (50 characters max).
  4136.                                 Subscript 2 City (25 characters max).
  4137.  
  4138.                                 Subscript 3 State (10 characters max).
  4139.                                 Subscript 4 ZIP Code (10 characters max).
  4140.                                 Subscript 5 Country (15 characters max).
  4141.  
  4142.                        Remarks
  4143.                       This  array is filled  with information  from the  current users
  4144.                           record when the  GETUSER statement is executed.   It may then be
  4145.                           changed and written  back to the  users record with  the PUTUSER
  4146.                           statement.    Note  that the  array  is  empty  until  a GETUSER
  4147.                           statement is processed and that changes  are not written until a
  4148.                           PUTUSER  statement is processed.   Additionally, the  array will
  4149.                           only  have  meaningful   information  if  the  address   PSA  is
  4150.                           installed.  The existence of the address PSA may be checked with
  4151.                           the PSA() function.
  4152.  
  4153.                        Examples
  4154.  
  4155.                         IF (PSA(3)) THEN
  4156.                           GETUSER
  4157.                           INPUT "Addr 1",U_ADDR(0)
  4158.                           INPUT "Addr 2",U_ADDR(1)
  4159.                           INPUT "City  ",U_ADDR(2)
  4160.                           INPUT "State ",U_ADDR(3)
  4161.                           INPUT "ZIP   ",U_ADDR(4)
  4162.                           INPUT "Cntry ",U_ADDR(5)
  4163.                           PUTUSER
  4164.                         ENDIF
  4165.  
  4166.                    See Also
  4167.                       GETUSER Statement, PSA() Function, PUTUSER Statement
  4168.  
  4169.  
  4170.  
  4171.  
  4172.  
  4173.  
  4174.  
  4175.                           
  4176.  
  4177.  
  4178.  
  4179.                   U_ALIAS   VARIABLE
  4180.  
  4181.                    Function
  4182.                       Allow reading and writing of the current users alias.
  4183.  
  4184.                        Type & Value
  4185.                       STRING      The current users alias (25 characters max).
  4186.  
  4187.                        Remarks
  4188.  
  4189.                       This  STRING is filled  with information from  the current users
  4190.                           record when  the GETUSER statement is executed.   It may then be
  4191.                           changed  and written back  to the users record  with the PUTUSER
  4192.                           statement.   Note that it is  empty until a GETUSER statement is
  4193.                           processed and  that changes  are  not written  until  a  PUTUSER
  4194.                           statement  is  processed.    Additionally,  it  will  only  have
  4195.                           meaningful information  if  the  alias PSA  is installed.    The
  4196.                           existence  of  the  alias  PSA may  be  checked  with the  PSA()
  4197.                           function.
  4198.                        Examples
  4199.  
  4200.                         IF (PSA(1)) THEN
  4201.                           GETUSER
  4202.                           PRINTLN "Your alias is ",U_ALIAS
  4203.                         ELSE
  4204.                           PRINTLN "Your name is ",U_NAME()
  4205.                         ENDIF
  4206.  
  4207.                    See Also
  4208.                       GETUSER Statement, PSA() Function, PUTUSER Statement
  4209.  
  4210.  
  4211.  
  4212.  
  4213.  
  4214.  
  4215.  
  4216.                           
  4217.  
  4218.  
  4219.  
  4220.                   U_BDL()   Function
  4221.  
  4222.                    Function
  4223.                       Access the total number of bytes downloaded by the current user.
  4224.  
  4225.                        Syntax
  4226.                       U_BDL()
  4227.                                 No arguments are required
  4228.  
  4229.                        Return Type & Value
  4230.  
  4231.                       INTEGER     Returns the current users total bytes downloaded.
  4232.                        Remarks
  4233.  
  4234.                       This function  will return  information  that can  be useful  in
  4235.                           modifying  PCBoard's built  in ratio  management system  and the
  4236.                           view user information command.   Of course, it is not limited to
  4237.                           that; anywhere you need to know  how many bytes the current user
  4238.                           has  downloaded, this  function will  provide that  information.
  4239.                           Unlike the  predefined U_... user variables,  this function does
  4240.                           not require the use of GETUSER to return valid information.
  4241.                        Examples
  4242.  
  4243.                         PRINTLN "You have ULed ",U_BUL()," bytes and DLed
  4244.                         ",U_BDL()," bytes."
  4245.  
  4246.                    See Also
  4247.  
  4248.  
  4249.  
  4250.  
  4251.  
  4252.  
  4253.  
  4254.                           
  4255.  
  4256.  
  4257.  
  4258.                   U_BDLDAY()   Function
  4259.  
  4260.                    Function
  4261.                       Access the number of bytes downloaded by the current user today.
  4262.  
  4263.                        Syntax
  4264.                       U_BDLDAY()
  4265.                                 No arguments are required
  4266.  
  4267.                        Return Type & Value
  4268.  
  4269.                       INTEGER     Returns the current users bytes downloaded today.
  4270.                        Remarks
  4271.  
  4272.                       This function  will return  information  that can  be useful  in
  4273.                           modifying  PCBoard's built  in ratio  management system  and the
  4274.                           view user information command.   Of course, it is not limited to
  4275.                           that; anywhere you need to know  how many bytes the current user
  4276.                           has   downloaded  today,   this  function   will  provide   that
  4277.                           information.   Unlike the predefined U_...  user variables, this
  4278.                           function does  not require the  use of GETUSER  to return  valid
  4279.                           information.
  4280.                        Examples
  4281.  
  4282.                         PRINTLN "You have downloaded ",U_BDLDAY()," bytes
  4283.                         today."
  4284.  
  4285.                    See Also
  4286.  
  4287.  
  4288.  
  4289.  
  4290.  
  4291.  
  4292.  
  4293.                           
  4294.  
  4295.  
  4296.  
  4297.                   U_BDPHONE   VARIABLE
  4298.  
  4299.                    Function
  4300.                       Allow  reading and  writing of  the current  users business/data
  4301.                           phone number.
  4302.  
  4303.                        Type & Value
  4304.                       STRING      The current  users business/data  phone  number  (13
  4305.                           characters max).
  4306.  
  4307.                        Remarks
  4308.  
  4309.                       This STRING  is filled with  information from the  current users
  4310.                           record  when the GETUSER statement is  executed.  It may then be
  4311.                           changed  and written back  to the users record  with the PUTUSER
  4312.                           statement.  Note that it  is empty until a GETUSER  statement is
  4313.                           processed and  that  changes  are not  written until  a  PUTUSER
  4314.                           statement is processed.
  4315.                        Examples
  4316.  
  4317.                         GETUSER
  4318.                         PRINTLN "   Home/Voice Phone Number:  ",U_HVPHONE
  4319.                         PRINTLN "Business/Data Phone Number:  ",U_BDPHONE
  4320.  
  4321.                    See Also
  4322.                       GETUSER Statement, PUTUSER Statement
  4323.  
  4324.  
  4325.  
  4326.  
  4327.  
  4328.  
  4329.  
  4330.                           
  4331.  
  4332.  
  4333.  
  4334.                   U_BUL()   Function
  4335.  
  4336.                    Function
  4337.                       Access the total number of bytes uploaded by the current user.
  4338.  
  4339.                        Syntax
  4340.                       U_BUL()
  4341.                                 No arguments are required
  4342.  
  4343.                        Return Type & Value
  4344.  
  4345.                       INTEGER     Returns the current users total bytes uploaded.
  4346.                        Remarks
  4347.  
  4348.                       This function  will return  information  that can  be useful  in
  4349.                           modifying  PCBoard's built  in ratio  management system  and the
  4350.                           view user information command.   Of course, it is not limited to
  4351.                           that; anywhere you need to know  how many bytes the current user
  4352.                           has  uploaded,  this  function  will  provide  that information.
  4353.                           Unlike the  predefined U_... user variables,  this function does
  4354.                           not require the use of GETUSER to return valid information.
  4355.                        Examples
  4356.  
  4357.                         PRINTLN "You have ULed ",U_BUL()," bytes and DLed
  4358.                         ",U_BDL()," bytes."
  4359.  
  4360.                    See Also
  4361.  
  4362.  
  4363.  
  4364.  
  4365.  
  4366.  
  4367.  
  4368.                           
  4369.  
  4370.  
  4371.  
  4372.                   U_CITY   VARIABLE
  4373.  
  4374.                    Function
  4375.                       Allow reading and writing of the current users city information.
  4376.  
  4377.                        Type & Value
  4378.                       STRING      The  current users  city information  (24 characters
  4379.                           max).
  4380.  
  4381.                        Remarks
  4382.  
  4383.                       This STRING is  filled with information  from the current  users
  4384.                           record when the GETUSER  statement is executed.  It may  then be
  4385.                           changed  and written back  to the users record  with the PUTUSER
  4386.                           statement.  Note  that it is empty until  a GETUSER statement is
  4387.                           processed  and  that changes  are not  written  until a  PUTUSER
  4388.                           statement is processed.  Note that this information is  separate
  4389.                           from the address  PSA and does not require that  the address PSA
  4390.                           be installed.
  4391.                        Examples
  4392.  
  4393.                         GETUSER
  4394.                         LET U_CITY = "Timbuktu"
  4395.                         PRINTLN "You are now from Timbuktu!  :)"
  4396.                         PUTUSER
  4397.  
  4398.                    See Also
  4399.                       GETUSER Statement, PUTUSER Statement
  4400.  
  4401.  
  4402.  
  4403.  
  4404.  
  4405.  
  4406.  
  4407.                           
  4408.  
  4409.  
  4410.  
  4411.                   U_CLS   VARIABLE
  4412.  
  4413.                    Function
  4414.                       Allow reading  and writing  of the current  users message  clear
  4415.                           screen flag.
  4416.  
  4417.                        Type & Value
  4418.                       BOOLEAN     The current users clear screen flag status  (TRUE or
  4419.                           FALSE).
  4420.  
  4421.                        Remarks
  4422.  
  4423.                       This BOOLEAN  is set  with  information from  the current  users
  4424.                           record  when the GETUSER statement is  executed.  It may then be
  4425.                           changed  and written back  to the users record  with the PUTUSER
  4426.                           statement.   Note that it is undefined until a GETUSER statement
  4427.                           is  processed and that  changes are not written  until a PUTUSER
  4428.                           statement is processed.
  4429.                        Examples
  4430.  
  4431.                         GETUSER
  4432.                         PRINTLN "Turning on the message clear screen
  4433.                         flag..."
  4434.                         LET U_CLS = TRUE
  4435.                         PUTUSER
  4436.  
  4437.                    See Also
  4438.                       GETUSER Statement, PUTUSER Statement
  4439.  
  4440.  
  4441.  
  4442.  
  4443.  
  4444.  
  4445.  
  4446.                           
  4447.  
  4448.  
  4449.  
  4450.                   U_CMNT1   VARIABLE
  4451.  
  4452.                    Function
  4453.                       Allow reading and writing of the current users comment field.
  4454.  
  4455.                        Type & Value
  4456.                       STRING      The current users comment field (30 characters max).
  4457.  
  4458.                        Remarks
  4459.  
  4460.                       This  STRING is filled  with information from  the current users
  4461.                           record when  the GETUSER statement is executed.   It may then be
  4462.                           changed  and written back  to the users record  with the PUTUSER
  4463.                           statement.   Note that it is  empty until a GETUSER statement is
  4464.                           processed and  that changes  are  not written  until  a  PUTUSER
  4465.                           statement is processed.  Note that this  information is separate
  4466.                           from  the notes PSA  (though similar) and does  not require that
  4467.                           the notes PSA be installed.
  4468.                        Examples
  4469.  
  4470.                         GETUSER
  4471.                         PRINTLN " User Comment:  ",U_CMNT1
  4472.                         PRINTLN "SysOp Comment:  ",U_CMNT2
  4473.  
  4474.                    See Also
  4475.                       GETUSER Statement, PUTUSER Statement
  4476.  
  4477.  
  4478.  
  4479.  
  4480.  
  4481.  
  4482.  
  4483.                           
  4484.  
  4485.  
  4486.  
  4487.                   U_CMNT2   VARIABLE
  4488.  
  4489.                    Function
  4490.                       Allow reading  and writing  of the current  users SysOp  comment
  4491.                           field.
  4492.  
  4493.                        Type & Value
  4494.                       STRING      The current users SysOp comment field (30 characters
  4495.                           max).
  4496.  
  4497.                        Remarks
  4498.  
  4499.                       This STRING  is filled with  information from the  current users
  4500.                           record  when the GETUSER statement is  executed.  It may then be
  4501.                           changed  and written back  to the users record  with the PUTUSER
  4502.                           statement.  Note that it  is empty until a GETUSER  statement is
  4503.                           processed and  that  changes  are not  written until  a  PUTUSER
  4504.                           statement is  processed.  Note that this information is separate
  4505.                           from  the notes PSA  (though similar) and does  not require that
  4506.                           the notes PSA be installed.
  4507.                        Examples
  4508.  
  4509.                         GETUSER
  4510.                         PRINTLN " User Comment:  ",U_CMNT1
  4511.                         PRINTLN "SysOp Comment:  ",U_CMNT2
  4512.  
  4513.                    See Also
  4514.                       GETUSER Statement, PUTUSER Statement
  4515.  
  4516.  
  4517.  
  4518.  
  4519.  
  4520.  
  4521.  
  4522.                           
  4523.  
  4524.  
  4525.  
  4526.                   U_DEF79   VARIABLE
  4527.  
  4528.                    Function
  4529.                       Allow  reading and writing  of the current  users message editor
  4530.                           default width flag.
  4531.  
  4532.                        Type & Value
  4533.                       BOOLEAN     The current users default  editor width flag  status
  4534.                           (TRUE or FALSE).
  4535.  
  4536.                        Remarks
  4537.  
  4538.                       This BOOLEAN  is set  with  information from  the current  users
  4539.                           record  when the GETUSER statement is  executed.  It may then be
  4540.                           changed  and written back  to the users record  with the PUTUSER
  4541.                           statement.   Note that it is undefined until a GETUSER statement
  4542.                           is  processed and that  changes are not written  until a PUTUSER
  4543.                           statement is processed.
  4544.                        Examples
  4545.  
  4546.                         GETUSER
  4547.                         PRINTLN "Turning on the wide message editor
  4548.                         flag..."
  4549.                         LET U_DEF79 = TRUE
  4550.                         PUTUSER
  4551.  
  4552.                    See Also
  4553.                       GETUSER Statement, PUTUSER Statement
  4554.  
  4555.  
  4556.  
  4557.  
  4558.  
  4559.  
  4560.  
  4561.                           
  4562.  
  4563.  
  4564.  
  4565.                   U_EXPDATE   VARIABLE
  4566.  
  4567.                    Function
  4568.                       Allow reading  and  writing of  the current  users  subscription
  4569.                           expiration date.
  4570.  
  4571.                        Type & Value
  4572.                       DATE  The current users subscription expiration date.
  4573.  
  4574.                        Remarks
  4575.  
  4576.                       This  DATE is set with information from the current users record
  4577.                           when  the GETUSER statement is executed.  It may then be changed
  4578.                           and written back to the users record with the PUTUSER statement.
  4579.                           Note that it is undefined until a GETUSER statement is processed
  4580.                           and  that changes are  not written until a  PUTUSER statement is
  4581.                           processed.
  4582.                        Examples
  4583.  
  4584.                         GETUSER
  4585.                         PRINTLN "Your subscription will expire on
  4586.                         ",U_EXPDATE
  4587.  
  4588.                    See Also
  4589.                       GETUSER Statement, PUTUSER Statement
  4590.  
  4591.  
  4592.  
  4593.  
  4594.  
  4595.  
  4596.  
  4597.                           
  4598.  
  4599.  
  4600.  
  4601.                   U_EXPERT   VARIABLE
  4602.  
  4603.                    Function
  4604.                       Allow reading  and writing  of the current  users expert  status
  4605.                           flag.
  4606.  
  4607.                        Type & Value
  4608.                       BOOLEAN     The  current  users  expert  flag  status  (TRUE  or
  4609.                           FALSE).
  4610.  
  4611.                        Remarks
  4612.  
  4613.                       This BOOLEAN  is set  with  information from  the current  users
  4614.                           record  when the GETUSER statement is  executed.  It may then be
  4615.                           changed  and written back  to the users record  with the PUTUSER
  4616.                           statement.   Note that it is undefined until a GETUSER statement
  4617.                           is  processed and that  changes are not written  until a PUTUSER
  4618.                           statement is processed.
  4619.                        Examples
  4620.  
  4621.                         GETUSER
  4622.                         PRINTLN "Turning off expert mode..."
  4623.                         LET U_EXPERT = FALSE
  4624.                         PUTUSER
  4625.  
  4626.                    See Also
  4627.                       GETUSER Statement, PUTUSER Statement
  4628.  
  4629.  
  4630.  
  4631.  
  4632.  
  4633.  
  4634.  
  4635.                           
  4636.  
  4637.  
  4638.  
  4639.                   U_EXPSEC   VARIABLE
  4640.  
  4641.                    Function
  4642.                       Allow reading and writing of the current users expired  security
  4643.                           level.
  4644.  
  4645.                        Type & Value
  4646.                       INTEGER     The current users security level (0 - 255).
  4647.  
  4648.                        Remarks
  4649.  
  4650.                       This INTEGER  is  set with  information from  the current  users
  4651.                           record when the GETUSER  statement is executed.  It may  then be
  4652.                           changed  and written back  to the users record  with the PUTUSER
  4653.                           statement.   Note that it is undefined until a GETUSER statement
  4654.                           is  processed and that  changes are not written  until a PUTUSER
  4655.                           statement is processed.
  4656.                        Examples
  4657.  
  4658.                         GETUSER
  4659.                         PRINTLN "Your security after subscription
  4660.                         expiration will be ",U_SEC
  4661.  
  4662.                    See Also
  4663.                       GETUSER Statement, PUTUSER Statement
  4664.  
  4665.  
  4666.  
  4667.  
  4668.  
  4669.  
  4670.  
  4671.                           
  4672.  
  4673.  
  4674.  
  4675.                   U_FDL()   Function
  4676.  
  4677.                    Function
  4678.                       Access the total number of files downloaded by the current user.
  4679.  
  4680.                        Syntax
  4681.                       U_FDL()
  4682.                                 No arguments are required
  4683.  
  4684.                        Return Type & Value
  4685.  
  4686.                       INTEGER     Returns the current users total files downloaded.
  4687.                        Remarks
  4688.  
  4689.                       This function  will return  information  that can  be useful  in
  4690.                           modifying  PCBoard's built  in ratio  management system  and the
  4691.                           view user information command.   Of course, it is not limited to
  4692.                           that; anywhere you need to know  how many files the current user
  4693.                           has  downloaded, this  function will  provide that  information.
  4694.                           Unlike the  predefined U_... user variables,  this function does
  4695.                           not require the use of GETUSER to return valid information.
  4696.                        Examples
  4697.  
  4698.                         PRINTLN "You have ULed ",U_FUL()," bytes and DLed
  4699.                         ",U_FDL()," files."
  4700.  
  4701.                    See Also
  4702.  
  4703.  
  4704.  
  4705.  
  4706.  
  4707.  
  4708.  
  4709.                           
  4710.  
  4711.  
  4712.  
  4713.                   U_FSE   VARIABLE
  4714.  
  4715.                    Function
  4716.                       Allow reading  and  writing  of the  current users  full  screen
  4717.                           editor default flag.
  4718.  
  4719.                        Type & Value
  4720.                       BOOLEAN     The  current users full  screen editor  default flag
  4721.                           status (TRUE or FALSE).
  4722.  
  4723.                        Remarks
  4724.  
  4725.                       This BOOLEAN  is set  with  information from  the current  users
  4726.                           record  when the GETUSER statement is  executed.  It may then be
  4727.                           changed  and written back  to the users record  with the PUTUSER
  4728.                           statement.   Note that it is undefined until a GETUSER statement
  4729.                           is  processed and that  changes are not written  until a PUTUSER
  4730.                           statement is processed.
  4731.                        Examples
  4732.  
  4733.                         GETUSER
  4734.                         PRINTLN "Turning on full screen editor as
  4735.                         default..."
  4736.                         LET U_FSE = TRUE
  4737.                         PUTUSER
  4738.  
  4739.                    See Also
  4740.                       GETUSER Statement, PUTUSER Statement
  4741.  
  4742.  
  4743.  
  4744.  
  4745.  
  4746.  
  4747.  
  4748.                           
  4749.  
  4750.  
  4751.  
  4752.                   U_FSEP   VARIABLE
  4753.  
  4754.                    Function
  4755.                       Allow reading  and  writing  of the  current users  full  screen
  4756.                           editor prompt flag.
  4757.  
  4758.                        Type & Value
  4759.                       BOOLEAN     The  current users  full screen  editor prompt  flag
  4760.                           status (TRUE or FALSE).
  4761.  
  4762.                        Remarks
  4763.  
  4764.                       This BOOLEAN  is set  with  information from  the current  users
  4765.                           record  when the GETUSER statement is  executed.  It may then be
  4766.                           changed  and written back  to the users record  with the PUTUSER
  4767.                           statement.   Note that it is undefined until a GETUSER statement
  4768.                           is  processed and that  changes are not written  until a PUTUSER
  4769.                           statement is processed.
  4770.                        Examples
  4771.  
  4772.                         GETUSER
  4773.                         PRINTLN "Turning off full screen editor
  4774.                         prompting..."
  4775.                         LET U_FSEP = FALSE
  4776.                         PUTUSER
  4777.  
  4778.                    See Also
  4779.                       GETUSER Statement, PUTUSER Statement
  4780.  
  4781.  
  4782.  
  4783.  
  4784.  
  4785.  
  4786.  
  4787.                           
  4788.  
  4789.  
  4790.  
  4791.                   U_FUL()   Function
  4792.  
  4793.                    Function
  4794.                       Access the total number of files uploaded by the current user.
  4795.  
  4796.                        Syntax
  4797.                       U_FUL()
  4798.                                 No arguments are required
  4799.  
  4800.                        Return Type & Value
  4801.  
  4802.                       INTEGER     Returns the current users total files uploaded.
  4803.                        Remarks
  4804.  
  4805.                       This function  will return  information  that can  be useful  in
  4806.                           modifying  PCBoard's built  in ratio  management system  and the
  4807.                           view user information command.   Of course, it is not limited to
  4808.                           that; anywhere you need to know  how many files the current user
  4809.                           has  uploaded,  this  function  will  provide  that information.
  4810.                           Unlike the  predefined U_... user variables,  this function does
  4811.                           not require the use of GETUSER to return valid information.
  4812.                        Examples
  4813.  
  4814.                         PRINTLN "You have ULed ",U_FUL()," bytes and DLed
  4815.                         ",U_FDL()," files."
  4816.  
  4817.                    See Also
  4818.  
  4819.  
  4820.  
  4821.  
  4822.  
  4823.  
  4824.  
  4825.                           
  4826.  
  4827.  
  4828.  
  4829.                   U_HVPHONE   VARIABLE
  4830.  
  4831.                    Function
  4832.                       Allow reading and writing of the current users home/voice  phone
  4833.                           number.
  4834.  
  4835.                        Type & Value
  4836.                       STRING      The  current  users  home/voice   phone  number  (13
  4837.                           characters max).
  4838.  
  4839.                        Remarks
  4840.  
  4841.                       This STRING  is filled with  information from the  current users
  4842.                           record  when the GETUSER statement is  executed.  It may then be
  4843.                           changed  and written back  to the users record  with the PUTUSER
  4844.                           statement.  Note that it  is empty until a GETUSER  statement is
  4845.                           processed and  that  changes  are not  written until  a  PUTUSER
  4846.                           statement is processed.
  4847.                        Examples
  4848.  
  4849.                         GETUSER
  4850.                         PRINTLN "   Home/Voice Phone Number:  ",U_HVPHONE
  4851.                         PRINTLN "Business/Data Phone Number:  ",U_BDPHONE
  4852.  
  4853.                    See Also
  4854.                       GETUSER Statement, PUTUSER Statement
  4855.  
  4856.  
  4857.  
  4858.  
  4859.  
  4860.  
  4861.  
  4862.                           
  4863.  
  4864.  
  4865.  
  4866.                   U_INCONF()   Function
  4867.  
  4868.                    Function
  4869.                       Determine if a user is registered in a conference.
  4870.  
  4871.                        Syntax
  4872.                       U_INCONF(rec,conf)
  4873.                                 rec  An integer expression with the record number  of the
  4874.                           user to check.
  4875.  
  4876.                                 conf An integer expression with the conference number  to
  4877.                           check.
  4878.  
  4879.                        Return Type & Value
  4880.                       BOOLEAN     Returns  TRUE if  the  user  is  registered  in  the
  4881.                           specified conference, FALSE otherwise.
  4882.  
  4883.                        Remarks
  4884.                       It is sometimes necessary  to know if a user is  registered in a
  4885.                           conference (for example, when entering a message to a particular
  4886.                           user).  This function will return TRUE if the user is registered
  4887.                           in the conference specified.   Before calling this  function you
  4888.                           need to find  the users record number  from the USERS file  with
  4889.                           the U_RECNUM() function.
  4890.  
  4891.                        Examples
  4892.                         INTEGER i,rec
  4893.                         STRING  un,ynStr(1)
  4894.                         LET ynStr(0) = "NO"
  4895.                         LET ynStr(1) = "YES"
  4896.                         INPUT "User name",un
  4897.                         NEWLINE
  4898.                         LET rec = U_RECNUM(un)
  4899.                         FOR i = 1 TO 10
  4900.                           PRINTLN un," in conf ",i,": 
  4901.                         ",ynStr(U_INCONF(i,rec))
  4902.                         NEXT
  4903.  
  4904.                    See Also
  4905.  
  4906.                       U_RECNUM() Function
  4907.  
  4908.  
  4909.  
  4910.  
  4911.  
  4912.  
  4913.  
  4914.                           
  4915.  
  4916.  
  4917.  
  4918.                   U_LDATE()   Function
  4919.  
  4920.                    Function
  4921.                       Access the last log on date of a user.
  4922.  
  4923.                        Syntax
  4924.                       U_LDATE()
  4925.                                 No arguments are required
  4926.  
  4927.                        Return Type & Value
  4928.  
  4929.                       DATE  Returns the current users last log on date.
  4930.                        Remarks
  4931.  
  4932.                       PCBoard tracks  the  last  log on  date  for each  user.    This
  4933.                           function will  return that date  for the user  currently online.
  4934.                           Unlike the  predefined U_... user variables,  this function does
  4935.                           not require the use of GETUSER to return valid information.
  4936.                        Examples
  4937.  
  4938.                         PRINTLN "You last logged on ",U_LDATE(),"."
  4939.  
  4940.                    See Also
  4941.  
  4942.  
  4943.  
  4944.  
  4945.  
  4946.  
  4947.  
  4948.                           
  4949.  
  4950.  
  4951.  
  4952.                   U_LDIR()   Function
  4953.  
  4954.                    Function
  4955.                       Access the latest file date found in a file scan by a user.
  4956.  
  4957.                        Syntax
  4958.                       U_LDIR()
  4959.                                 No arguments are required
  4960.  
  4961.                        Return Type & Value
  4962.  
  4963.                       DATE  Returns the latest file date found by the current user.
  4964.                        Remarks
  4965.  
  4966.                       PCBoard  tracks  the  latest  file found  by  each  user.   This
  4967.                           function will  return that date  for the user  currently online.
  4968.                           Unlike the  predefined U_... user variables,  this function does
  4969.                           not require the use of GETUSER to return valid information.
  4970.                        Examples
  4971.  
  4972.                         PRINTLN "Latest file found was dated ",U_LDIR(),"."
  4973.  
  4974.                    See Also
  4975.  
  4976.  
  4977.  
  4978.  
  4979.  
  4980.  
  4981.  
  4982.                           
  4983.  
  4984.  
  4985.  
  4986.                   U_LOGONS()   Function
  4987.  
  4988.                    Function
  4989.                       Access the total number of system logons by the current user.
  4990.  
  4991.                        Syntax
  4992.                       U_LOGONS()
  4993.                                 No arguments are required
  4994.  
  4995.                        Return Type & Value
  4996.  
  4997.                       INTEGER     Returns the current users total system logons.
  4998.                        Remarks
  4999.  
  5000.                       PCBoard tracks the  total number of logons for each  user.  This
  5001.                           function will return that  number for the user currently online.
  5002.                           Unlike the  predefined U_... user variables,  this function does
  5003.                           not require the use of GETUSER to return valid information.
  5004.                        Examples
  5005.  
  5006.                         PRINTLN "You have logged on to @BOARDNAME@
  5007.                         ",U_LOGONS()," times."
  5008.  
  5009.                    See Also
  5010.  
  5011.  
  5012.  
  5013.  
  5014.  
  5015.  
  5016.  
  5017.                           
  5018.  
  5019.  
  5020.  
  5021.                   U_LONGHDR   VARIABLE
  5022.  
  5023.                    Function
  5024.                       Allow  reading and  writing  of the  current users  long message
  5025.                           header flag.
  5026.  
  5027.                        Type & Value
  5028.                       BOOLEAN     The  current users long  message header  flag status
  5029.                           (TRUE or FALSE).
  5030.  
  5031.                        Remarks
  5032.  
  5033.                       This BOOLEAN  is set  with  information from  the current  users
  5034.                           record  when the GETUSER statement is  executed.  It may then be
  5035.                           changed  and written back  to the users record  with the PUTUSER
  5036.                           statement.   Note that it is undefined until a GETUSER statement
  5037.                           is  processed and that  changes are not written  until a PUTUSER
  5038.                           statement is processed.
  5039.                        Examples
  5040.  
  5041.                         GETUSER
  5042.                         PRINTLN "Turning on long message headers..."
  5043.                         LET U_LONGHDR = TRUE
  5044.                         PUTUSER
  5045.  
  5046.                    See Also
  5047.                       GETUSER Statement, PUTUSER Statement
  5048.  
  5049.  
  5050.  
  5051.  
  5052.  
  5053.  
  5054.  
  5055.                           
  5056.  
  5057.  
  5058.  
  5059.                   U_LTIME()   Function
  5060.  
  5061.                    Function
  5062.                       Access the time of day that a user last logged on.
  5063.  
  5064.                        Syntax
  5065.                       U_LTIME()
  5066.                                 No arguments are required
  5067.  
  5068.                        Return Type & Value
  5069.  
  5070.                       TIME  Returns the time of day of the current users last log on.
  5071.                        Remarks
  5072.  
  5073.                       PCBoard tracks the last time of day of the  last log on for each
  5074.                           user.    This function  will  return  that  time  for  the  user
  5075.                           currently online.   Unlike the predefined  U_... user variables,
  5076.                           this  function does  not require  the use  of GETUSER  to return
  5077.                           valid information.
  5078.                        Examples
  5079.  
  5080.                         PRINTLN "You last logged on at ",U_LTIME(),"."
  5081.  
  5082.                    See Also
  5083.  
  5084.  
  5085.  
  5086.  
  5087.  
  5088.  
  5089.  
  5090.                           
  5091.  
  5092.  
  5093.  
  5094.                   U_MSGRD()   Function
  5095.  
  5096.                    Function
  5097.                       Access the total number of messages read by the current user.
  5098.  
  5099.                        Syntax
  5100.                       U_MSGRD()
  5101.                                 No arguments are required
  5102.  
  5103.                        Return Type & Value
  5104.  
  5105.                       INTEGER     Returns the current users total messages read.
  5106.                        Remarks
  5107.  
  5108.                       PCBoard tracks the  total number of messages read by  each user.
  5109.                           This function  will return  that number  for the  user currently
  5110.                           online.    One  quick  idea  for  use:    a  message/file  ratio
  5111.                           enforcement door.   Unlike the predefined  U_... user variables,
  5112.                           this  function does  not require  the use  of GETUSER  to return
  5113.                           valid information.
  5114.                        Examples
  5115.  
  5116.                         IF ((U_MSGRD()+U_MSGWR())/U_FDL() > 10) THEN
  5117.                           PRINTLN "You need to do more messaging!!!"
  5118.                           END
  5119.                         ENDIF
  5120.  
  5121.                    See Also
  5122.  
  5123.  
  5124.  
  5125.  
  5126.  
  5127.  
  5128.  
  5129.                           
  5130.  
  5131.  
  5132.  
  5133.                   U_MSGWR()   Function
  5134.  
  5135.                    Function
  5136.                       Access the total number of messages written by the current user.
  5137.  
  5138.                        Syntax
  5139.                       U_MSGWR()
  5140.                                 No arguments are required
  5141.  
  5142.                        Return Type & Value
  5143.  
  5144.                       INTEGER     Returns the current users total messages written.
  5145.                        Remarks
  5146.  
  5147.                       PCBoard tracks  the total  number  of messages  written by  each
  5148.                           user.   This  function  will return  that  number for  the  user
  5149.                           currently online.  One quick idea for use:  a message/file ratio
  5150.                           enforcement door.   Unlike the predefined  U_... user variables,
  5151.                           this  function does  not require  the use  of GETUSER  to return
  5152.                           valid information.
  5153.                        Examples
  5154.  
  5155.                         IF ((U_MSGRD()+U_MSGWR())/U_FDL() > 10) THEN
  5156.                           PRINTLN "You need to do more messaging!!!"
  5157.                           END
  5158.                         ENDIF
  5159.  
  5160.                    See Also
  5161.  
  5162.  
  5163.  
  5164.  
  5165.  
  5166.  
  5167.  
  5168.                           
  5169.  
  5170.  
  5171.  
  5172.                   U_NAME()   Function
  5173.  
  5174.                    Function
  5175.                       Access the current users name.
  5176.  
  5177.                        Syntax
  5178.                       U_NAME()
  5179.                                 No arguments are required
  5180.  
  5181.                        Return Type & Value
  5182.  
  5183.                       STRING      Returns a string with the current users name.
  5184.                        Remarks
  5185.  
  5186.                       Perhaps the most important  piece of information about a  caller
  5187.                           is  his name.   The user name  differentiates a user  from every
  5188.                           other  user  on the  BBS  and  can be  used  to  track PPE  user
  5189.                           information  that  must be  kept separate  from all  other users
  5190.                           information.   Unlike the predefined U_...  user variables, this
  5191.                           function does  not require the  use of GETUSER  to return  valid
  5192.                           information.
  5193.                        Examples
  5194.  
  5195.                         IF (U_NAME() = "JOHN DOE) THEN
  5196.                           PRINTLN "I know who you are!  Welcome!"
  5197.                           GETUSER
  5198.                           LET U_SEC = 110
  5199.                           PUTUSER
  5200.                           PRINTLN "Automatically upgraded!"
  5201.                         ENDIF
  5202.  
  5203.                    See Also
  5204.  
  5205.  
  5206.  
  5207.  
  5208.  
  5209.  
  5210.  
  5211.                           
  5212.  
  5213.  
  5214.  
  5215.                   U_NOTES()   VARIABLE ARRAY
  5216.  
  5217.                    Function
  5218.                       Allow reading and writing of current user notes.
  5219.  
  5220.                        Type & Value
  5221.                       STRING
  5222.                                 Subscript 0-4     SysOp   defineable    user   notes   (60
  5223.                           characters max).
  5224.  
  5225.                        Remarks
  5226.  
  5227.                       This  array is  filled with  information from the  current users
  5228.                           record  when the GETUSER statement is  executed.  It may then be
  5229.                           changed  and written back  to the users record  with the PUTUSER
  5230.                           statement.    Note  that  the array  is  empty  until a  GETUSER
  5231.                           statement  is processed and that changes are not written until a
  5232.                           PUTUSER  statement is processed.   Additionally,  the array will
  5233.                           only have meaningful information  if the notes PSA is installed.
  5234.                           The existence  of the  notes PSA may  be checked with  the PSA()
  5235.                           function.
  5236.                        Examples
  5237.  
  5238.                         INTEGER i
  5239.                         IF (PSA(6)) THEN
  5240.                           GETUSER
  5241.                           FOR i = 0 TO 4
  5242.                             PRINTLN "Note ",i+1,":  ",U_NOTES(i)
  5243.                           NEXT
  5244.                         ENDIF
  5245.  
  5246.                    See Also
  5247.                       GETUSER Statement, PSA() Function, PUTUSER Statement
  5248.  
  5249.  
  5250.  
  5251.  
  5252.  
  5253.  
  5254.  
  5255.                           
  5256.  
  5257.  
  5258.  
  5259.                   U_PAGELEN   VARIABLE
  5260.  
  5261.                    Function
  5262.                       Allow reading  and  writing  of the  current users  page  length
  5263.                           setting.
  5264.  
  5265.                        Type & Value
  5266.                       INTEGER     The current users page length (0 - 255).
  5267.  
  5268.                        Remarks
  5269.  
  5270.                       This integer  is  set with  information from  the current  users
  5271.                           record when the GETUSER  statement is executed.  It may  then be
  5272.                           changed  and written back  to the users record  with the PUTUSER
  5273.                           statement.   Note that it is undefined until a GETUSER statement
  5274.                           is  processed and that  changes are not written  until a PUTUSER
  5275.                           statement is processed.
  5276.                        Examples
  5277.  
  5278.                         GETUSER
  5279.                         PRINTLN "Your page length was ",U_PAGELEN
  5280.                         LET U_PAGELEN = 20
  5281.                         PRINTLN "Your page length is now ",U_PAGELEN
  5282.                         PUTUSER
  5283.  
  5284.                    See Also
  5285.                       GETUSER Statement, PUTUSER Statement
  5286.  
  5287.  
  5288.  
  5289.  
  5290.  
  5291.  
  5292.  
  5293.                           
  5294.  
  5295.  
  5296.  
  5297.                   U_PWD   VARIABLE
  5298.  
  5299.                    Function
  5300.                       Allow reading and writing of the current users password.
  5301.  
  5302.                        Type & Value
  5303.                       STRING      The current users password (12 characters max).
  5304.  
  5305.                        Remarks
  5306.  
  5307.                       This  STRING is filled  with information from  the current users
  5308.                           record when  the GETUSER statement is executed.   It may then be
  5309.                           changed  and written back  to the users record  with the PUTUSER
  5310.                           statement.   Note that it is  empty until a GETUSER statement is
  5311.                           processed and  that changes  are  not written  until  a  PUTUSER
  5312.                           statement is processed.  A mask of  valid characters that may be
  5313.                           used  in  the  U_PWD variable  is  available  via  the  MASK_PWD
  5314.                           function.
  5315.                        Examples
  5316.  
  5317.                         STRING s
  5318.                         INPUT "Enter Password",s,@X0E,12,MASK_PWD(),UPCASE
  5319.                         GETUSER
  5320.                         IF (s <> U_PWD) THEN
  5321.                           PRINTLN "Sorry, hanging up"
  5322.                           HANGUP
  5323.                         ENDIF
  5324.  
  5325.                    See Also
  5326.                       GETUSER Statement, MASK_PWD() Function, PUTUSER Statement
  5327.  
  5328.  
  5329.  
  5330.  
  5331.  
  5332.  
  5333.  
  5334.                           
  5335.  
  5336.  
  5337.  
  5338.                   U_PWDEXP   VARIABLE
  5339.  
  5340.                    Function
  5341.                       Allow  reading  and  writing  of  the  current  users   password
  5342.                           expiration date.
  5343.  
  5344.                        Type & Value
  5345.                       DATE  The current users password expiration date.
  5346.  
  5347.                        Remarks
  5348.  
  5349.                       This  DATE is set with information from the current users record
  5350.                           when  the GETUSER statement is executed.  It may then be changed
  5351.                           and written back to the users record with the PUTUSER statement.
  5352.                           Note that it is undefined until a GETUSER statement is processed
  5353.                           and  that changes are  not written until a  PUTUSER statement is
  5354.                           processed.     Additionally,  it   will  only   have  meaningful
  5355.                           information  if the password PSA is installed.  The existence of
  5356.                           the password PSA may be checked with the PSA() function.
  5357.                        Examples
  5358.  
  5359.                         IF (PSA(4)) THEN
  5360.                           GETUSER
  5361.                           PRINTLN U_PWDEXP-DATE()," until current password
  5362.                         expiration"
  5363.                           LET U_PWDEXP = DATE()+30
  5364.                           PRINTLN "You now have 30 days until you *MUST*
  5365.                         change you password."
  5366.                           PUTUSER
  5367.                         ENDIF
  5368.  
  5369.                    See Also
  5370.                       GETUSER Statement, PSA() Function, PUTUSER Statement
  5371.  
  5372.  
  5373.  
  5374.  
  5375.  
  5376.  
  5377.  
  5378.                           
  5379.  
  5380.  
  5381.  
  5382.                   U_PWDHIST()   Function
  5383.  
  5384.                    Function
  5385.                       Access the last three passwords used by the current user.
  5386.  
  5387.                        Syntax
  5388.                       U_PWDHIST(num)
  5389.                                 num  The  number of  the  password  from the  history  to
  5390.                           return (1 through 3).
  5391.  
  5392.                        Return Type & Value
  5393.  
  5394.                       STRING      Returns the specified  password from the history  (1
  5395.                           for the most recent, 3 for the least recent).
  5396.                        Remarks
  5397.  
  5398.                       PCBoard has the  ability to track the last three  passwords used
  5399.                           by each user.  This function  will return one of those passwords
  5400.                           from  the history  for the  user currently  online.   Unlike the
  5401.                           predefined U_... user variables, this function does not  require
  5402.                           the use  of GETUSER to  return valid information.   However,  it
  5403.                           does  require that the password PSA has been installed to return
  5404.                           meaningful information.   The existence of the  password PSA may
  5405.                           be checked via the PSA() function.
  5406.                        Examples
  5407.  
  5408.                         INTEGER i
  5409.                         IF (PSA(4)) THEN
  5410.                           FOR i = 1 TO 3
  5411.                             PRINTLN "Password history ",i,": 
  5412.                         ",U_PWDHIST(i)
  5413.                           NEXT
  5414.                         ENDIF
  5415.  
  5416.                    See Also
  5417.                       PSA() Function
  5418.  
  5419.  
  5420.  
  5421.  
  5422.  
  5423.  
  5424.  
  5425.                           
  5426.  
  5427.  
  5428.  
  5429.                   U_PWDLC()   Function
  5430.  
  5431.                    Function
  5432.                       Access the last date the user changed his password.
  5433.  
  5434.                        Syntax
  5435.                       U_PWDLC()
  5436.                                 No arguments are required
  5437.  
  5438.                        Return Type & Value
  5439.  
  5440.                       DATE  Returns the last date the user changed his password.
  5441.                        Remarks
  5442.  
  5443.                       PCBoard has  the ability to  track the last  date of  a password
  5444.                           change for each user.   This function will return that date  for
  5445.                           the user currently  online.   Unlike the  predefined U_...  user
  5446.                           variables,  this function does not require the use of GETUSER to
  5447.                           return valid  information.   However, it does  require that  the
  5448.                           password   PSA  has   been   installed   to  return   meaningful
  5449.                           information.  The  existence of the password PSA may  be checked
  5450.                           via the PSA() function.
  5451.                        Examples
  5452.  
  5453.                         IF (PSA(4)) PRINTLN "You last changed your password
  5454.                         on ",U_PWDLC(),"."
  5455.  
  5456.                    See Also
  5457.                       PSA() Function
  5458.  
  5459.  
  5460.  
  5461.  
  5462.  
  5463.  
  5464.  
  5465.                           
  5466.  
  5467.  
  5468.  
  5469.                   U_PWDTC()   Function
  5470.  
  5471.                    Function
  5472.                       Access the number of times the user has changed his password.
  5473.  
  5474.                        Syntax
  5475.                       U_PWDTC()
  5476.                                 No arguments are required
  5477.  
  5478.                        Return Type & Value
  5479.  
  5480.                       INTEGER     Returns the number of times the user has changed his
  5481.                           password.
  5482.                        Remarks
  5483.  
  5484.                       PCBoard has  the ability to track the total number of times each
  5485.                           user changes his password.  This function will return that count
  5486.                           for the user currently online.  Unlike the predefined U_... user
  5487.                           variables,  this function does not require the use of GETUSER to
  5488.                           return valid  information.   However, it  does require that  the
  5489.                           password   PSA  has   been   installed  to   return   meaningful
  5490.                           information.  The  existence of the password PSA may  be checked
  5491.                           via the PSA() function.
  5492.                        Examples
  5493.  
  5494.                         IF (PSA(4)) THEN
  5495.                           PRINTLN "You have changed your password
  5496.                         ",U_PWDTC()," times."
  5497.                         ENDIF
  5498.  
  5499.                    See Also
  5500.                       PSA() Function
  5501.  
  5502.  
  5503.  
  5504.  
  5505.  
  5506.  
  5507.  
  5508.                           
  5509.  
  5510.  
  5511.  
  5512.                   U_RECNUM()   Function
  5513.  
  5514.                    Function
  5515.                       Determine  if a user  is registered on  the system  and what the
  5516.                           record number is.
  5517.  
  5518.                        Syntax
  5519.                       U_RECNUM(user)
  5520.                                 user A string  expression with  the user  name to  search
  5521.                           for.
  5522.  
  5523.                        Return Type & Value
  5524.  
  5525.                       INTEGER     Returns  the record number of  the user in the USERS
  5526.                           file if found or -1 if not found.
  5527.                        Remarks
  5528.  
  5529.                       This  function serves two  purposes.  The first  is to determine
  5530.                           whether  or not a given  user name is registered  on the system.
  5531.                           If the  value -1 is returned  the user isn't in  the user files.
  5532.                           The  second use  is  to  get the  users  record number  for  the
  5533.                           U_INCONF() function  to  determine  whether or  not  a  user  is
  5534.                           registered in a given conference.
  5535.                        Examples
  5536.  
  5537.                         INTEGER i,rec
  5538.                         STRING  un,ynStr(1)
  5539.                         LET ynStr(0) = "NO"
  5540.                         LET ynStr(1) = "YES"
  5541.                         INPUT "User name",un
  5542.                         NEWLINE
  5543.                         LET rec = U_RECNUM(un)
  5544.                         FOR i = 1 TO 10
  5545.                           PRINTLN un," in conf ",i,": 
  5546.                         ",ynStr(U_INCONF(i,rec))
  5547.                         NEXT
  5548.  
  5549.                    See Also
  5550.                       U_INCONF() Function
  5551.  
  5552.  
  5553.  
  5554.  
  5555.  
  5556.  
  5557.  
  5558.                           
  5559.  
  5560.  
  5561.  
  5562.                   U_SCROLL   VARIABLE
  5563.  
  5564.                    Function
  5565.                       Allow reading  and  writing of  the current  users  multi-screen
  5566.                           message scroll flag.
  5567.  
  5568.                        Type & Value
  5569.                       BOOLEAN     The  current  users  scroll  flag  status  (TRUE  or
  5570.                           FALSE).
  5571.  
  5572.                        Remarks
  5573.  
  5574.                       This BOOLEAN  is set  with  information from  the current  users
  5575.                           record  when the GETUSER statement is  executed.  It may then be
  5576.                           changed  and written back  to the users record  with the PUTUSER
  5577.                           statement.   Note that it is undefined until a GETUSER statement
  5578.                           is  processed and that  changes are not written  until a PUTUSER
  5579.                           statement is processed.
  5580.                        Examples
  5581.  
  5582.                         GETUSER
  5583.                         PRINTLN "Turning off message scrolling..."
  5584.                         LET U_SCROLL = FALSE
  5585.                         PUTUSER
  5586.  
  5587.                    See Also
  5588.                       GETUSER Statement, PUTUSER Statement
  5589.  
  5590.  
  5591.  
  5592.  
  5593.  
  5594.  
  5595.  
  5596.                           
  5597.  
  5598.  
  5599.  
  5600.                   U_SEC   VARIABLE
  5601.  
  5602.                    Function
  5603.                       Allow reading and writing of the current users security level.
  5604.  
  5605.                        Type & Value
  5606.                       INTEGER     The current users security level (0 - 255).
  5607.  
  5608.                        Remarks
  5609.  
  5610.                       This  INTEGER is  set with  information from  the current  users
  5611.                           record when  the GETUSER statement is executed.   It may then be
  5612.                           changed  and written back  to the users record  with the PUTUSER
  5613.                           statement.   Note that it is undefined until a GETUSER statement
  5614.                           is  processed and that  changes are not written  until a PUTUSER
  5615.                           statement is processed.
  5616.                        Examples
  5617.  
  5618.                         GETUSER
  5619.                         PRINTLN "Raising your security to level 20..."
  5620.                         LET U_SEC = 20
  5621.                         PUTUSER
  5622.                         PRINTLN "Automatic upgrade complete!"
  5623.  
  5624.                    See Also
  5625.                       GETUSER Statement, PUTUSER Statement
  5626.  
  5627.  
  5628.  
  5629.  
  5630.  
  5631.  
  5632.  
  5633.                           
  5634.  
  5635.  
  5636.  
  5637.                   U_STAT()   Function
  5638.  
  5639.                    Function
  5640.                       Access a statistic about the current user.
  5641.  
  5642.                        Syntax
  5643.                       U_TIMEON(stat)
  5644.                                 stat The statistic to retrieve (1 through 15).
  5645.  
  5646.                        Return Type & Value
  5647.  
  5648.                       DATE  Returns the first date the user  called the system if stat
  5649.                           is 1.
  5650.                           INTEGER     Returns one of the following for all other values of
  5651.                           stat:
  5652.                                 2     The number of times the user has paged the SysOp;
  5653.  
  5654.                                 3     The number of group chats the  user has participated
  5655.                           in;
  5656.                                 4     The number of comments left by the user;
  5657.                                 5     The number of 300 bps connects by the user;
  5658.  
  5659.                                 6     The number of 1200 bps connects by the user;
  5660.                                 7     The number of 2400 bps connects by the user;
  5661.  
  5662.                                 8     The number of connects by the user greater than 2400
  5663.                           bps and less  than or  equal to  9600 bps (9600  bps >=  connect
  5664.                           speed > 2400 bps);
  5665.                                 9     The number of connects by the user greater than 9600
  5666.                           bps and less than or  equal to 14,400 bps (14,400 bps >= connect
  5667.                           speed > 9600 bps);
  5668.                                 10    The number of security violations by the user;
  5669.  
  5670.                                 11    The  number  of   "not  registered  in   conference"
  5671.                           warnings to the user;
  5672.                                 12    The number of  times the  user's download limit  has
  5673.                           been reached;
  5674.                                 13    The number of "file not found" warnings to the user;
  5675.  
  5676.                                 14    The number  of password errors to  access the user's
  5677.                           account;
  5678.                                 15    The  number of  verify errors  to access  the user's
  5679.                           account.
  5680.  
  5681.                        Remarks
  5682.                       PCBoard has the  ability to track  a number of  statistics about
  5683.                           the user.  This  function will return the  desired statistic for
  5684.                           the  user currently online.   Unlike  the predefined  U_... user
  5685.                           variables, this function does not require  the use of GETUSER to
  5686.  
  5687.  
  5688.  
  5689.  
  5690.  
  5691.  
  5692.  
  5693.                           
  5694.  
  5695.                           return valid  information.   However, it  does require  that the
  5696.                           statistics   PSA  has   been  installed  to   return  meaningful
  5697.                           information.  The existence of the statistics PSA may be checked
  5698.                           via the PSA() function.
  5699.                        Examples
  5700.  
  5701.                         STRING  label
  5702.                         INTEGER i
  5703.                         FOPEN 1,PPEPATH()+"STATTEXT",O_RD,S_DN
  5704.                         FOR i = 1 TO 15
  5705.                           FGET 1,label
  5706.                           PRINTLN label," - ",U_STAT(i)
  5707.                         NEXT
  5708.                         FCLOSE 1
  5709.  
  5710.                    See Also
  5711.                       PSA() Function
  5712.  
  5713.  
  5714.  
  5715.  
  5716.  
  5717.  
  5718.  
  5719.                           
  5720.  
  5721.  
  5722.  
  5723.                   U_TIMEON()   Function
  5724.  
  5725.                    Function
  5726.                       Access the users time online today in minutes.
  5727.  
  5728.                        Syntax
  5729.                       U_TIMEON()
  5730.                                 No arguments are required
  5731.  
  5732.                        Return Type & Value
  5733.  
  5734.                       INTEGER     Returns the users time online today in minutes.
  5735.                        Remarks
  5736.  
  5737.                       PCBoard  tracks the users  time online each day.   This function
  5738.                           will  return the  elapsed time  for the  user  currently online.
  5739.                           Unlike the  predefined U_... user variables,  this function does
  5740.                           not require the use of GETUSER to return valid information.
  5741.                        Examples
  5742.  
  5743.                         PRINTLN "You have been online for ",U_TIMEON(),"
  5744.                         total minutes today."
  5745.  
  5746.                    See Also
  5747.  
  5748.  
  5749.  
  5750.  
  5751.  
  5752.  
  5753.  
  5754.                           
  5755.  
  5756.  
  5757.  
  5758.                   U_TRANS   VARIABLE
  5759.  
  5760.                    Function
  5761.                       Allow reading and writing of the current users default  transfer
  5762.                           protocol letter.
  5763.  
  5764.                        Type & Value
  5765.                       STRING      The current users  default transfer protocol  letter
  5766.                           (1 character max).
  5767.  
  5768.                        Remarks
  5769.  
  5770.                       This STRING  is filled with  information from the  current users
  5771.                           record  when the GETUSER statement is  executed.  It may then be
  5772.                           changed  and written back  to the users record  with the PUTUSER
  5773.                           statement.  Note that it  is empty until a GETUSER  statement is
  5774.                           processed and  that  changes  are not  written until  a  PUTUSER
  5775.                           statement  is processed.   Valid characters that may  be used in
  5776.                           the U_TRANS variable are A through Z and 0 through 9.
  5777.                        Examples
  5778.  
  5779.                         GETUSER
  5780.                         PRINTLN "Your default file transfer protocol letter
  5781.                         is ",U_TRANS
  5782.                         LET U_TRANS = "N" ' Set to no default protocol
  5783.                         PRINTLN "Default file transfer protocol letter set
  5784.                         to None"
  5785.                         PUTUSER
  5786.  
  5787.                    See Also
  5788.                       GETUSER Statement, PUTUSER Statement
  5789.  
  5790.  
  5791.  
  5792.  
  5793.  
  5794.  
  5795.  
  5796.                           
  5797.  
  5798.  
  5799.  
  5800.                   U_VER   VARIABLE
  5801.  
  5802.                    Function
  5803.                       Allow reading  and  writing of  the current  users  verification
  5804.                           string.
  5805.  
  5806.                        Type & Value
  5807.                       STRING      The current users verification string (25 characters
  5808.                           max).
  5809.  
  5810.                        Remarks
  5811.  
  5812.                       This STRING  is filled with  information from the  current users
  5813.                           record  when the GETUSER statement is  executed.  It may then be
  5814.                           changed  and written back  to the users record  with the PUTUSER
  5815.                           statement.  Note that it  is empty until a GETUSER  statement is
  5816.                           processed and  that  changes  are not  written until  a  PUTUSER
  5817.                           statement  is  processed.    Additionally,  it  will  only  have
  5818.                           meaningful information  if the  verification PSA  is  installed.
  5819.                           The  existence of the  verification PSA may be  checked with the
  5820.                           PSA() function.
  5821.                        Examples
  5822.  
  5823.                         STRING s
  5824.                         IF (PSA(2)) THEN
  5825.                           GETUSER
  5826.                           PRINTLN "Enter verification information"
  5827.                           INPUT "",s
  5828.                           IF (s <> U_VER) HANGUP
  5829.                         ELSE
  5830.                           PRINTLN "No verification information available"
  5831.                         ENDIF
  5832.  
  5833.                    See Also
  5834.                       GETUSER Statement, PSA() Function, PUTUSER Statement
  5835.  
  5836.  
  5837.  
  5838.  
  5839.  
  5840.  
  5841.  
  5842.                           
  5843.  
  5844.  
  5845.  
  5846.                   VALCC()   Function
  5847.  
  5848.                    Function
  5849.                       Tests a string for credit card number format validity.
  5850.  
  5851.                        Syntax
  5852.                       VALCC(sexp)
  5853.                                 sexp Any string expression.
  5854.  
  5855.                        Return Type & Value
  5856.  
  5857.                       BOOLEAN     Returns TRUE  if the string  is a valid  credit card
  5858.                           number format, FALSE otherwise.
  5859.                        Remarks
  5860.  
  5861.                       This function will take a string and attempt to identify it as a
  5862.                           credit card  number.   If the number  is invalid for  any reason
  5863.                           (insufficient  digits  or bad  checksum,  primarily)  then  this
  5864.                           function will return FALSE, otherwise it will return TRUE.
  5865.                        Examples
  5866.  
  5867.                         STRING s
  5868.                         WHILE (!VALCC(s)) DO
  5869.                           INPUT "CC #",s
  5870.                           NEWLINES 2
  5871.                         ENDWHILE
  5872.                         PRINTLN CCTYPE(s)," - ",FMTCC(s)
  5873.  
  5874.                    See Also
  5875.                       CCTYPE()   Function,  FMTCC()   Function,  VALDATE()   Function,
  5876.                           VALTIME() Function
  5877.  
  5878.  
  5879.  
  5880.  
  5881.  
  5882.  
  5883.  
  5884.                           
  5885.  
  5886.  
  5887.  
  5888.                   VALDATE()   Function
  5889.  
  5890.                    Function
  5891.                       Tests a string for date format validity.
  5892.  
  5893.                        Syntax
  5894.                       VALDATE(sexp)
  5895.                                 sexp Any string expression.
  5896.  
  5897.                        Return Type & Value
  5898.  
  5899.                       BOOLEAN     Returns  TRUE if the string is  a valid date format,
  5900.                           FALSE otherwise.
  5901.                        Remarks
  5902.  
  5903.                       PPL  does it  best  to convert  incompatible  types,  as needed,
  5904.                           automatically.    Converting a  STRING  type to  a DATE  type is
  5905.                           particularly  problematic  because  of the  virtually  unlimited
  5906.                           numbers  of strings possible.  This function checks to make sure
  5907.                           that the hour is from  0 to 23, the minute is from  0 to 59, and
  5908.                           the  second (optional)  is  from  0 to  59.   Also,  each  field
  5909.                           (hours/minutes/seconds)  must be separated  by a colon.   If the
  5910.                           string matches these requirements then the string is  considered
  5911.                           valid and TRUE is returned.   Any other string will result  in a
  5912.                           FALSE value being returned.
  5913.                        Examples
  5914.  
  5915.                         STRING s
  5916.                         WHILE (!VALTIME(s)) DO
  5917.                           INPUT "Time",s
  5918.                           NEWLINES 2
  5919.                         ENDWHILE
  5920.                         TIME t
  5921.                         LET t = s
  5922.                         PRINTLN s," ",t
  5923.  
  5924.                    See Also
  5925.                       VALCC() Function, VALDATE() Function
  5926.  
  5927.  
  5928.  
  5929.  
  5930.  
  5931.  
  5932.  
  5933.                           
  5934.  
  5935.  
  5936.  
  5937.                   VALTIME()   Function
  5938.  
  5939.                    Function
  5940.                       Tests a string for time format validity.
  5941.  
  5942.                        Syntax
  5943.                       VALTIME(sexp)
  5944.                                 sexp Any string expression.
  5945.  
  5946.                        Return Type & Value
  5947.  
  5948.                       BOOLEAN     Returns  TRUE if the string is  a valid time format,
  5949.                           FALSE otherwise.
  5950.                        Remarks
  5951.  
  5952.                       PPL  does it  best  to convert  incompatible  types,  as needed,
  5953.                           automatically.    Converting a  STRING  type to  a TIME  type is
  5954.                           particularly  problematic  because  of the  virtually  unlimited
  5955.                           numbers  of strings possible.  This function checks to make sure
  5956.                           that the hour is from  0 to 23, the minute is from  0 to 59, and
  5957.                           the  second (optional)  is  from  0 to  59.   Also,  each  field
  5958.                           (hours/minutes/seconds)  must be separated  by a colon.   If the
  5959.                           string matches these requirements then the string is  considered
  5960.                           valid and TRUE is returned.   Any other string will result  in a
  5961.                           FALSE value being returned.
  5962.                        Examples
  5963.  
  5964.                         STRING s
  5965.                         WHILE (!VALTIME(s)) DO
  5966.                           INPUT "Time",s
  5967.                           NEWLINES 2
  5968.                         ENDWHILE
  5969.                         TIME t
  5970.                         LET t = s
  5971.                         PRINTLN s," ",t
  5972.  
  5973.                    See Also
  5974.                       VALCC() Function, VALDATE() Function
  5975.  
  5976.  
  5977.  
  5978.  
  5979.  
  5980.  
  5981.  
  5982.                           
  5983.  
  5984.  
  5985.  
  5986.                   VARADDR   Statement
  5987.  
  5988.                    Function
  5989.                       Sets a variable to the complete address of another variable.
  5990.  
  5991.                        Syntax
  5992.                       VARADDR src,dest
  5993.                                 src  The variable to get the address of.
  5994.  
  5995.                                 dest The variable to store the address in.
  5996.  
  5997.                        Remarks
  5998.                       This  statement  is  primarily useful  in  conjunction  with the
  5999.                           DOINTR statement.  It may be necessary to  give an interrupt the
  6000.                           address  of  a  memory  location  that  can  be  used  to  store
  6001.                           information.  This statement  will allow you to get the  address
  6002.                           of a specified variable to pass to the DOINTR statement.
  6003.                        Examples
  6004.  
  6005.                         ' Create subdirectory - DOS function 39h
  6006.                         INTEGER addr
  6007.                         STRING  path
  6008.                         LET path = "C:\$TMPDIR$"
  6009.                         VARADDR path,addr
  6010.                         DOINTR 21h,39h,0,0,addr%10000h,0,0,0,addr/10000h,0
  6011.                         IF (REGCF() & (REGAX() = 3)) THEN
  6012.                           PRINTLN "Error:  Path not found"
  6013.                         ELSE IF (REGCF() & (REGAX() = 5)) THEN
  6014.                           PRINTLN "Error:  Access Denied"
  6015.                         ELSE IF (REGCF()) THEN
  6016.                           PRINTLN "Error:  Unknown Error"
  6017.                         ELSE
  6018.                           PRINTLN "Directory successfully created..."
  6019.                         ENDIF
  6020.  
  6021.                    See Also
  6022.  
  6023.                       MKADDR() Function, VAROFF Statement, VARSEG Statement
  6024.  
  6025.  
  6026.  
  6027.  
  6028.  
  6029.  
  6030.  
  6031.                           
  6032.  
  6033.  
  6034.  
  6035.                   VAROFF   Statement
  6036.  
  6037.                    Function
  6038.                       Sets a variable to the offset address of another variable.
  6039.  
  6040.                        Syntax
  6041.                       VAROFF src,dest
  6042.                                 src  The variable to get the offset address of.
  6043.  
  6044.                                 dest The variable to store the offset address in.
  6045.  
  6046.                        Remarks
  6047.                       This  statement  is  primarily useful  in  conjunction  with the
  6048.                           DOINTR statement.  It may be necessary to  give an interrupt the
  6049.                           address  of  a  memory  location  that  can  be  used  to  store
  6050.                           information.   This statement will  allow you to get  the offset
  6051.                           address of a specified variable to pass to the DOINTR statement.
  6052.                        Examples
  6053.  
  6054.                         ' Create subdirectory - DOS function 39h
  6055.                         INTEGER saddr, oaddr
  6056.                         STRING  path
  6057.                         LET path = "C:\$TMPDIR$"
  6058.                         VARSEG path,saddr
  6059.                         VAROFF path,oaddr
  6060.                         DOINTR 21h,39h,0,0,oaddr,0,0,0,saddr,0
  6061.                         IF (REGCF() & (REGAX() = 3)) THEN
  6062.                           PRINTLN "Error:  Path not found"
  6063.                         ELSE IF (REGCF() & (REGAX() = 5)) THEN
  6064.                           PRINTLN "Error:  Access Denied"
  6065.                         ELSE IF (REGCF()) THEN
  6066.                           PRINTLN "Error:  Unknown Error"
  6067.                         ELSE
  6068.                           PRINTLN "Directory successfully created..."
  6069.                         ENDIF
  6070.  
  6071.                    See Also
  6072.  
  6073.                       MKADDR() Function, VARADDR Statement, VARSEG Statement
  6074.  
  6075.  
  6076.  
  6077.  
  6078.  
  6079.  
  6080.  
  6081.                           
  6082.  
  6083.  
  6084.  
  6085.                   VARSEG   Statement
  6086.  
  6087.                    Function
  6088.                       Sets a variable to the segment address of another variable.
  6089.  
  6090.                        Syntax
  6091.                       VARSEG src,dest
  6092.                                 src  The variable to get the segment address of.
  6093.  
  6094.                                 dest The variable to store the segment address in.
  6095.  
  6096.                        Remarks
  6097.                       This  statement  is  primarily useful  in  conjunction  with the
  6098.                           DOINTR statement.  It may be necessary to  give an interrupt the
  6099.                           address  of  a  memory  location  that  can  be  used  to  store
  6100.                           information.  This statement  will allow you to get the  segment
  6101.                           address of a specified variable to pass to the DOINTR statement.
  6102.                        Examples
  6103.  
  6104.                         ' Create subdirectory - DOS function 39h
  6105.                         INTEGER saddr, oaddr
  6106.                         STRING  path
  6107.                         LET path = "C:\$TMPDIR$"
  6108.                         VARSEG path,saddr
  6109.                         VAROFF path,oaddr
  6110.                         DOINTR 21h,39h,0,0,oaddr,0,0,0,saddr,0
  6111.                         IF (REGCF() & (REGAX() = 3)) THEN
  6112.                           PRINTLN "Error:  Path not found"
  6113.                         ELSE IF (REGCF() & (REGAX() = 5)) THEN
  6114.                           PRINTLN "Error:  Access Denied"
  6115.                         ELSE IF (REGCF()) THEN
  6116.                           PRINTLN "Error:  Unknown Error"
  6117.                         ELSE
  6118.                           PRINTLN "Directory successfully created..."
  6119.                         ENDIF
  6120.  
  6121.                    See Also
  6122.  
  6123.                       MKADDR() Function, VARADDR Statement, VAROFF Statement
  6124.  
  6125.  
  6126.  
  6127.  
  6128.  
  6129.  
  6130.  
  6131.                           
  6132.  
  6133.  
  6134.  
  6135.                   VER()   Function
  6136.  
  6137.                    Function
  6138.                       Get the version of PPL available.
  6139.  
  6140.                        Syntax
  6141.                       VER()
  6142.                                 No arguments are required
  6143.  
  6144.                        Return Type & Value
  6145.  
  6146.                       INTEGER     Returns the version number of PPL running.
  6147.                        Remarks
  6148.  
  6149.                       As time passes,  new features will be added to  PCBoard and PPL.
  6150.                           Of  course, in order  to utilize the  new features, you  must be
  6151.                           running  a version of PCBoard that supports them.  This function
  6152.                           will  return  the version  of  PCBoard (and  PPL).   For PCBoard
  6153.                           version 15.0 this value will be 1500.  In other words, the major
  6154.                           version will  be accessable via VER()/100, and the minor version
  6155.                           will be  available via VER()%100.   Everything documented herein
  6156.                           will  be available  for all  versions greater  than or  equal to
  6157.                           1500.   Future PPL features will be documented with the required
  6158.                           version.
  6159.                        Examples
  6160.  
  6161.                         IF (VER() < 1600) THEN
  6162.                           PRINTLN "PCBoard Version 16.0 required for this
  6163.                         PPE file"
  6164.                           END
  6165.                         ENDIF
  6166.                         FOO a,b,c,d,e ' Obviously, this is not a 15.0
  6167.                         statement
  6168.  
  6169.                    See Also
  6170.  
  6171.  
  6172.  
  6173.  
  6174.  
  6175.  
  6176.  
  6177.                           
  6178.  
  6179.  
  6180.  
  6181.                   WAIT   Statement
  6182.  
  6183.                    Function
  6184.                       Wait for the user to hit ENTER.
  6185.  
  6186.                        Syntax
  6187.                       WAIT
  6188.                                 No arguments are required
  6189.  
  6190.                        Remarks
  6191.  
  6192.                       It is often necessary to pause in the display of information and
  6193.                           wait for  the user  to catch up.   This statement allows  you to
  6194.                           wait  for the user to hit  ENTER before continuing.  It displays
  6195.                           prompt number 418 from the PCBTEXT file for the current language
  6196.                           to let the user know what is expected.
  6197.                        Examples
  6198.  
  6199.                         PRINTLN "Your account has expired!"
  6200.                         PRINTLN "You are about to be logged off"
  6201.                         WAIT
  6202.  
  6203.                    See Also
  6204.                       MORE Statement
  6205.  
  6206.  
  6207.  
  6208.  
  6209.  
  6210.  
  6211.  
  6212.                           
  6213.  
  6214.  
  6215.  
  6216.                   WAITFOR   Statement
  6217.  
  6218.                    Function
  6219.                       Wait for a specific string of text to come in from the modem.
  6220.  
  6221.                        Syntax
  6222.                       WAITFOR str,flag,sec
  6223.                                 str  Any string expression.
  6224.  
  6225.                                 flag A variable to return the status.
  6226.                                 sec  An  integer expression  with  the maximum  number of
  6227.                           seconds to wait.
  6228.  
  6229.                        Remarks
  6230.                       This  statement can  be  used to  wait  for specific  replies to
  6231.                           questions, responses  from terminal  emulators and modem  result
  6232.                           codes.   If the text  that is  needed isn't received  within the
  6233.                           specified  time  period,  or if  there  is not  a  remote caller
  6234.                           online,  flag will be set to FALSE.   If the text is found, then
  6235.                           flag will be TRUE.   If a remote caller is online this statement
  6236.                           will wait up to the maximum time for the text and return TRUE or
  6237.                           FALSE  as  appropriate.    If  the  caller  is  local,  it  will
  6238.                           immediately return FALSE.   Also, the  text to  wait for is  not
  6239.                           case sensitive.  "connect" will match "CONNECT".
  6240.  
  6241.                        Examples
  6242.  
  6243.                         BOOLEAN flag
  6244.                         KBDCHKOFF
  6245.                         CDCHKOFF
  6246.                         DTROFF
  6247.                         DELAY 18
  6248.                         DTRON
  6249.                         SENDMODEM "ATDT5551212" ' Please don't really dial
  6250.                         this number!
  6251.                         WAITFOR "CONNECT",flag,60
  6252.                         IF (!flag) SPRINLN "No connect found in 60 seconds"
  6253.                         CDCHKON
  6254.                         KBDCHKON
  6255.  
  6256.                    See Also
  6257.  
  6258.  
  6259.  
  6260.  
  6261.  
  6262.  
  6263.  
  6264.                           
  6265.  
  6266.  
  6267.  
  6268.                   WHILE/ENDWHILE   Statement
  6269.  
  6270.                    Function
  6271.                       Execute one or more statments while a condition is true.
  6272.  
  6273.                        Syntax
  6274.                       W H I L E        ( b e x p )         s t a t e m e n t
  6275.  
  6276.                       -                    o                    r                    -
  6277.  
  6278.                           W   H   I   L   E     (   b   e   x   p   )      D   O
  6279.  
  6280.                               s   t   a   t   e   m   e   n   t   (   s   )
  6281.  
  6282.                       ENDWHLLE
  6283.                                 bexp Any boolean expression.
  6284.  
  6285.                                 statement Any valid PPL statement.
  6286.  
  6287.                        Remarks
  6288.                       Computers are  known for  their  ability to  perform  monotonous
  6289.                           tasks quickly, efficiently, and accurately.  What better way  to
  6290.                           implement  monotony  than  through a  WHILE  loop?    The  WHILE
  6291.                           statement supports two  types of loops:   logical and block.   A
  6292.                           logical WHILE  loop is  a single  statement; if  a condition  is
  6293.                           TRUE, execute a single statement and check again.  A block WHILE
  6294.                           loop can be one or more statements.  The start of a  block WHILE
  6295.                           loop  is differentiated  from  a logical  WHILE loop  by  the DO
  6296.                           keyword immediately after the  condition.  At some point in  the
  6297.                           loop some  action must  be taken  that will  make the  condition
  6298.                           FALSE.   If the condition never  changes from TRUE to  FALSE you
  6299.                           have what  is  known as  an  infinite loop;  your computer  will
  6300.                           appear to  be hung, even  though it is rapidly  executing things
  6301.                           just  as  fast  as it  can.    Be sure  to  thoroughly  test all
  6302.                           programs, but especially programs with loops!
  6303.                        Examples
  6304.  
  6305.                         INTEGER i
  6306.                         LET i = 0
  6307.                         WHILE (i < 10) GOSUB sub
  6308.                         END
  6309.                         :sub
  6310.                         PRINTLN "i is ",i
  6311.                         INC i
  6312.                         RETURN
  6313.  
  6314.                         INTEGER i
  6315.                         LET i = 0
  6316.                         WHILE (i < 10) DO
  6317.  
  6318.  
  6319.  
  6320.  
  6321.  
  6322.  
  6323.  
  6324.                       
  6325.  
  6326.                           PRINTLN "i is ",i
  6327.                           INC i
  6328.                         ENDWHILE
  6329.  
  6330.                    See Also
  6331.                       FOR/NEXT Statement, IF/ELSEIF/ELSE/ENDIF Statement
  6332.  
  6333.  
  6334.  
  6335.  
  6336.  
  6337.  
  6338.  
  6339.                           
  6340.  
  6341.  
  6342.  
  6343.                   WORDWRAP   Constant
  6344.  
  6345.                    Function
  6346.                       Set the word wrap flag in an INPUTSTR or PROMPTSTR statement.
  6347.  
  6348.                        Value
  6349.                       512 = 1000000000b = 1000o = 200h
  6350.  
  6351.                        Remarks
  6352.                       The INPUTSTR  and PROMPTSTR statements have the  ability to word
  6353.                           wrap from one input  statement to the next input  statement.  If
  6354.                           you  reach the end of the input field PCBoard will automatically
  6355.                           save the  last word from the input field  in an internal buffer.
  6356.                           The  next input  statement  will use  that  saved word  if  both
  6357.                           statements used the  WORDWRAP constant.  If the  passed variable
  6358.                           isn't empty or  if an input statement is  used that doesn't have
  6359.                           the WORDWRAP flag set then the saved word will not be used.
  6360.  
  6361.                        Examples
  6362.  
  6363.                         STRING  s(5)
  6364.                         INTEGER i
  6365.                         CLS
  6366.                         FOR i = 1 TO 5
  6367.                           INPUTSTR "Line
  6368.                         "+STRING(i),s(i),@X0E,40,MASK_ASCII(),WORDWRAP+NEWL
  6369.                         INE
  6370.                         NEXT
  6371.                         CLS
  6372.                         FOR i = 1 TO 5
  6373.                           PRINTLN "Line ",i,":  ",s(i)
  6374.                         NEXT
  6375.  
  6376.                    See Also
  6377.                       INPUTSTR Statement, PROMPTSTR Statement
  6378.  
  6379.  
  6380.  
  6381.  
  6382.  
  6383.  
  6384.  
  6385.                           
  6386.  
  6387.  
  6388.  
  6389.                   WRUNET   Statement
  6390.  
  6391.                    Function
  6392.                       Write information to the USERNET file for a specific node.
  6393.  
  6394.                        Syntax
  6395.                       WRUNET node,stat,name,city,oper,br
  6396.                                 node An integer expression with the node to update.
  6397.  
  6398.                                 stat A string expression with the new node status.
  6399.                                 name A string expression with the new node user name.
  6400.  
  6401.                                 city A string expression with the new node city.
  6402.                                 oper A  string  expression with  the  new  node operation
  6403.                           text.
  6404.                                 br   A  string expression  with  the new  node  broadcast
  6405.                           text.
  6406.  
  6407.                        Remarks
  6408.                       To facilitate internode communications, a file named USERNET.XXX
  6409.                           is maintained with an entry for  each node on the system.   This
  6410.                           file is used by the BROADCAST command of PCBoard  and to prevent
  6411.                           multiple  simultaneous   logins,  among  other  things.     This
  6412.                           statement may be used to change information for the current node
  6413.                           (for example, to update operation text during PPE execution)  or
  6414.                           other nodes (for example, to broadcast a message).
  6415.  
  6416.                        Examples
  6417.  
  6418.                         RDUNET PCBNODE()
  6419.                         WRUNET
  6420.                         PCBNODE(),UN_STAT(),UN_NAME(),UN_CITY(),"Running
  6421.                         "+PPENAME(),""
  6422.                         RDUNET 1
  6423.                         WRUNET
  6424.                         1,UN_STAT(),UN_NAME(),UN_CITY(),UN_OPER(),"Hello
  6425.                         there node 1"
  6426.  
  6427.                    See Also
  6428.                       RDUNET Statement, UN_...() Function
  6429.  
  6430.  
  6431.  
  6432.  
  6433.  
  6434.  
  6435.  
  6436.                           
  6437.  
  6438.  
  6439.  
  6440.                   WRUSYS   Statement
  6441.  
  6442.                    Function
  6443.                       Write a USERS.SYS file out to disk.
  6444.  
  6445.                        Syntax
  6446.                       WRUSYS
  6447.                                 No arguments are required
  6448.  
  6449.                        Remarks
  6450.  
  6451.                       Some  DOOR  applications  require  a  USERS.SYS  file  to access
  6452.                           information about  the caller.    This statement  allows you  to
  6453.                           create that file  prior to running an application via  the SHELL
  6454.                           statement.   Should the DOOR make changes to the USERS.SYS file,
  6455.                           you should use the RDUSYS statement after  the SHELL to read the
  6456.                           changes back into memory.   It should  be noted that  it is  not
  6457.                           possible to  create the USERS.SYS  file with a  TPA record  with
  6458.                           this statement.
  6459.                        Examples
  6460.  
  6461.                         INTEGER ret
  6462.                         WRUSYS
  6463.                         SHELL FALSE,ret,"MYAPP.EXE",""
  6464.                         RDUSYS
  6465.  
  6466.                    See Also
  6467.                       RDUSYS Statement
  6468.  
  6469.  
  6470.  
  6471.  
  6472.  
  6473.  
  6474.  
  6475.                           
  6476.  
  6477.  
  6478.  
  6479.                   XOR()   Function
  6480.  
  6481.                    Function
  6482.                       Calculate  the  bitwise  XOR  (exclusive  or)  of  two   integer
  6483.                           arguments.
  6484.  
  6485.                        Syntax
  6486.                       AND(iexp1,iexp2)
  6487.                                 iexp1     Any integer expression.
  6488.  
  6489.                                 iexp2     Any integer expression.
  6490.  
  6491.                        Return Type & Value
  6492.                       INTEGER     Returns the bitwise XOR of iexp1 and iexp2.
  6493.  
  6494.                        Remarks
  6495.                       This function may be used to toggle selected bits  in an integer
  6496.                           expression  by XORing  the expression with  a mask that  has the
  6497.                           bits to toggle set to 1 and the bits to ignore set to 0.
  6498.  
  6499.                        Examples
  6500.                         ' Toggle the bits in the low byte
  6501.                         PRINTLN XOR(1248h,00FFh)
  6502.                         ' Toggle a flag
  6503.                         INTEGER flag
  6504.                         LET flag = XOR(flag,1)
  6505.  
  6506.                    See Also
  6507.  
  6508.                       AND() Function, NOT() Function, OR() Function
  6509.  
  6510.  
  6511.  
  6512.  
  6513.  
  6514.  
  6515.  
  6516.                           
  6517.  
  6518.  
  6519.  
  6520.                   YEAR()   Function
  6521.  
  6522.                    Function
  6523.                       Extracts the year from a specified date.
  6524.  
  6525.                        Syntax
  6526.                       YEAR(dexp)
  6527.                                 dexp Any date expression.
  6528.  
  6529.                        Return Type & Value
  6530.  
  6531.                       INTEGER     Returns the year from  the specified date expression
  6532.                           (dexp).  Valid return values are from 1900 to 2079.
  6533.                        Remarks
  6534.  
  6535.                       This  function  allows you  to  extract  a  particular piece  of
  6536.                           information about  a DATE  value, in this  case the year  of the
  6537.                           date.
  6538.                        Examples
  6539.  
  6540.                         PRINTLN "This year is:  ",YEAR(DATE())
  6541.  
  6542.                    See Also
  6543.                       DAY() Function, DOW() Function, MONTH() Function
  6544.  
  6545.  
  6546.  
  6547.  
  6548.  
  6549.  
  6550.  
  6551.                           
  6552.  
  6553.  
  6554.  
  6555.                   YESCHAR()   Function
  6556.  
  6557.                    Function
  6558.                       Get the yes response character for the current language.
  6559.  
  6560.                        Syntax
  6561.                       YESCHAR()
  6562.                                 No arguments are required
  6563.  
  6564.                        Return Type & Value
  6565.  
  6566.                       STRING      Returns the yes character for the current language.
  6567.                        Remarks
  6568.  
  6569.                       Support for  foreign  language yes/no  responses can  be  easily
  6570.                           added by  using this function  to determine what  an affirmative
  6571.                           response  should  be  instead  of  hardcoding  the  english  "Y"
  6572.                           character.
  6573.                        Examples
  6574.  
  6575.                         STRING ans
  6576.                         LET ans = YESCHAR()
  6577.                         INPUTSTR "Run program now",ans,@X0E,1,"",AUTO+YESNO
  6578.                         IF (ans = NOCHAR()) END
  6579.  
  6580.                    See Also
  6581.                       NOCHAR() Function, YESNO Constant
  6582.  
  6583.  
  6584.  
  6585.  
  6586.  
  6587.  
  6588.  
  6589.                           
  6590.  
  6591.  
  6592.  
  6593.                   YESNO   Constant
  6594.  
  6595.                    Function
  6596.                       Set the  international yes/no  response flag in  an INPUTSTR  or
  6597.                           PROMPTSTR statement.
  6598.  
  6599.                        Value
  6600.                       16384 = 100000000000000b = 40000o = 4000h
  6601.  
  6602.                        Remarks
  6603.                       The  INPUTSTR and PROMPTSTR statements have the ability to allow
  6604.                           a  yes/no  response  to  be entered  in  addition  to any  valid
  6605.                           characters  passed to  the  statement.    The  extra  characters
  6606.                           allowed are  Y/N (or whatever  characters were  defined for  the
  6607.                           current language; spanish  would use S/N, french would  use O/N,
  6608.                           etc).  Note that you do not need to pass any valid characters to
  6609.                           use  this flag;  regardless of  the other  legal  characters the
  6610.                           international Y/N characters will be allowed.
  6611.  
  6612.                        Examples
  6613.  
  6614.                         STRING ans
  6615.                         LET ans = NOCHAR()
  6616.                         INPUTSTR "Run program now",ans,@X0E,1,"",AUTO+YESNO
  6617.                         IF (ans = NOCHAR()) END
  6618.  
  6619.                    See Also
  6620.                       INPUTSTR  Statement,  NOCHAR()  Function,  PROMPTSTR  Statement,
  6621.                           YESCHAR() Function
  6622.  
  6623.  
  6624.  
  6625.  
  6626.  
  6627.  
  6628.  
  6629.                           
  6630.